组件中的异步计算 - VueJS?

Kit*_*Kit 18 vue.js vue-component vuejs2

我在组件中找到了异步计算方法的解决方案:

目前,我的组件是:

<div class="msg_content">
   {{messages}}
</div>

<script>
export default {
  computed: {
    messages: {
      get () {
        return api.get(`/users/${this.value.username}/message/`, {'headers': { 'Authorization': 'JWT ...' }})
        .then(response => response.data)
      }
    }
  },
}
</script>
Run Code Online (Sandbox Code Playgroud)

结果: {}

如何在Promise模式下重写?因为我认为我们可以通过写入Promise模式来异步计算.

Roy*_*y J 16

计算属性基本上是缓存其结果的函数,因此不必在每次需要时计算它们.它们根据使用的无功值自动更新.

你的计算机不使用任何被动物品,所以计算它没有意义.它现在返回一个Promise(假设通常的行为then).

这不是完全清楚你想达到什么样的,但我最好的猜测是,你应该建立一个数据项来保存response.data,使你api.get在通话created.就像是

export default {
  data() {
      return {
        //...
        messages: []
      };
  },
  created() {
    api.get(`/users/${this.value.username}/message/`, {
        'headers': {
          'Authorization': 'JWT ...'
        }
      })
      .then(response => this.messages = response.data);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 它处于生命周期的早期,因此理论上可以更快地开始。作为一个实际问题,我认为这没有多大区别,@DarkLite1 (2认同)
  • 感谢您的反馈。我还读到,如果您打算从 SPA 转到 SSR,那么最好不要使用“mounted”钩子,因为 SSR 模式中不存在该钩子。 (2认同)

小智 12

es7通过使用asyncawait结合axios的返回承诺使得这一点变得非常简单.你需要vue-async-computed包.

export default {
   asyncComputed: {
       async myResolvedValue() {
          return await api.get(`/users/${this.value.username}/message/`, {'headers': { 'Authorization': 'JWT ...' }})
              .then(response => response.data)
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @KitKit 在 github 上的对话之后,实际上并没有被驳回,但是 vue 创建者决定不在 vue 核心中实现它,同时仍然声明该库是好的 (5认同)
  • 如果不使用异步计算包,这怎么可能?我的意思是,一定有一种方法可以使用 watcher/vuex 吗? (5认同)