如何在Vue模板中显示异步数据

Ale*_*ler 5 javascript templates asynchronous vue.js

在显示异步加载的Vue模板数据的情况下,我很有趣。在我的特定情况下,我需要显示产品对象的标题属性:

<td class="deals__cell deals__cell_title">{{ getProduct(deal.metal).title }}</td>
Run Code Online (Sandbox Code Playgroud)

但是该产品当前未加载,因此标题根本不会呈现。我找到了一个可行的解决方案:如果未加载产品,则在解决诺言之后,请调用getProduct函数:

getProduct (id) {
  if (!this.rolledMetal.all.length) {
    this.getRolledMetal()
      .then(() => {
        this.getProduct(id)
      })
    return {
      title: ''
    }
  } else {
      return this.getRolledMetalById(id)
  }
}
Run Code Online (Sandbox Code Playgroud)

但是,也许您知道更优雅的解决方案,因为我认为这有点复杂:)

rol*_*oli 12

加载数据时,我总是使用加载器或微调器!

<template>
    <table>
        <thead>
            <tr>
                <th>One</th>
                <th>Two</th>
                <th>Three</th>
            </tr>
        </thead>
        <tbody>

            <template v-if="loading">
                <spinner></spinner> <!-- here use a loaded you prefer -->
            </template>

            <template v-else>
                <tr v-for="row in rows">
                    <td>{{ row.name }}</td>
                    <td>{{ row.lastName }}</td>
                </tr>
            </template>

        </tbody>
    </table>
</template>
Run Code Online (Sandbox Code Playgroud)

和脚本:

<script>
    import axios from 'axios'
    export default {
        data() {
            return {
                loading: false,
                rows: []
            }
        },
        created() {
            this.getDataFromApi()
        },
        methods: {
            getDataFromApi() {
                this.loading = true
                axios.get('/youApiUrl')
                .then(response => {
                    this.loading = false
                    this.rows = response.data
                })
                .catch(error => {
                    this.loading = false
                    console.log(error)
                })
            }
        }
    }
</script>
Run Code Online (Sandbox Code Playgroud)

  • @KickButtowski 不,它可以是异步的,一切都会正常工作。你只需要在 axios 调用中使用await +你就可以摆脱 .then 和 .catch (3认同)

Las*_*nen 7

在 Vue 中有一些处理异步数据的好方法。

  1. 调用一个方法,该方法在创建的生命周期挂钩中获取数据,并将其分配给数据属性。这意味着您的组件具有获取数据的方法和用于存储数据的数据属性。

  2. 调度一个获取数据的 Vuex 操作。该组件有一个计算属性,可以从 Vuex 获取数据。这意味着获取数据的函数在 Vuex 中,并且您的组件具有用于访问它的计算属性。

在这种情况下,看起来您的组件需要具有 RolledMetal 并基于此检索产品。为了解决这个问题,您可以添加获取它们的方法,并在创建的生命周期中调用它们。第二个方法应该在第一个方法之后的 then-block 中调用,以确保它按预期工作。