【问题标题】:VueJS rendering data from REST serviceVueJS 从 REST 服务渲染数据
【发布时间】:2017-10-28 20:06:55
【问题描述】:

我尝试将来自 http 请求的数据呈现给工作正常的组件,问题是在获取数据时它为空。当数据为 null 时,控制台会抛出 TypeError,直到所有数据都加载并提交到 Vuex 存储。

一切都按照我的猜测进行,我只是想弄清楚如何防止错误被抛出并等到所有适当的数据都被获取。我见过其他人使用 v-if 来检查数据是否为空,这将起作用。这似乎很乏味,而且有更好的方法来实现相同的结果,而不需要一个充满 v-if 语句检查每个状态的应用程序。

我遇到了这个解决方案,但它仍然没有按照我的预期工作,我仍然收到相同的控制台错误。我是否正确使用了这些关键词,它们的位置是否正确?因为我尝试过的每一个变化都没有改变。

Vuex 动作:

const actions = {
  getThread ({ commit }, payload) {
    Vue.http
      .get(`http://localhost:9000/threads/${payload.id}`)
      .then(async response => {
        commit(FETCH_THREAD, await response.data)
      })
  }
}

这是在我的 vue 文件中调用该操作:

created () {
    this.$store.dispatch('getThread', {id: '59280ab5acbafb17af9da902'})
  }

【问题讨论】:

  • @VAMSIKRISHNA 我也调查过这个,但它在控制台中产生了同样的错误。
  • 为什么是async-await?当get.then 中解析时,您已经收到了数据。此外,突变只能是同步的,所以如果我没有遗漏什么,这个 async-await 提交是没有意义的。
  • @wostex 这就是我感到困惑的地方,我只是跟着这篇帖子*.com/questions/41609155/… 出现了同样的问题。
  • 异步等待用于操作,而不是突变。那里的情况不同。为了避免在未获取数据时出现渲染错误,只需在模板中使用防护:例如v-if="mydata && mydata.length" 用于数组。

标签: asynchronous async-await vue.js vuex


【解决方案1】:

我假设您正在尝试在模板中显示商店中的某些内容。问题是,Vue 无法渲染尚不存在的东西。解决方法是检查数据是否存在。

我们以这个组件为例:

<template>
    <div>
        {{ someObject.name }}
    </div>
</template>

<script>
    export default {
        data () {
            return {
                someObject: null
            }
        },
        methods: {
            fetchTheObject () {
                this.someObject = {
                    id: 1,
                    name: 'My object'
                }
            }
        },
        created () {
            setTimeout( () => {
                this.fetchTheObject()
            }, 3000)
        }
    }
</script>

如您所见,您将在控制台中收到错误消息,因为在调用 fetchTheObject() 之前,someObject.name 不存在。

解决方案是放置一些v-if 属性来控制:

<template>
    <div>
        <span v-if="someObject === null">Fetching the object</span>
        <span v-else>{{ someObject.name }}</span>
    </div>
</template>

一般来说,您会希望显示一些微调器来向用户显示正在加载的内容...

希望对你有帮助

编辑:忘记代码中的异步等待,这里不需要它

【讨论】:

  • 如果3000之后还有数据怎么办?
  • 我不明白
  • 您为3000 设置了等待数据的超时时间。如果在现实世界中没有 3000 年之后的数据怎么办?
  • 在现实世界中,您应该发出一个 ajax 请求,该请求应该成功或失败。然后,您应该将此模型调整为成功/失败场景。例如,添加一个“fetching_error”变量并在此 fetching_error 设置为某个值时显示一些消息