vue.js - 使用 vue 创建的生命周期钩子获取数据,但似乎没有填充承诺的结果
问题描述
由于我对 vue 的了解有限,我面临的问题是,除非我在 vue js 模板中调用异步方法,否则即使我要在created
生命周期挂钩中调用异步方法,我也无法访问承诺的结果。我的理解created
是它被更早地调用,以便可以触发异步操作,例如从 api 获取数据。
正如您将在下面的代码中看到的那样,该函数loadAlerts()
在created
. 但是,除非我{{loadAlerts()}}
在模板中调用,否则我将无法在alerts
紧随li
其后的中使用承诺的结果 , 。模板内调用的问题是{{loadAlerts}}
模板上[object Promise]
也显示了。如果我{{loadAlerts}}
从模板中删除,则不会显示任何警报。
内部的调用不应该created
已经填充了承诺的结果,例如:alerts
?{{loadAlerts()}}
正如您将在下面的代码中看到的那样,我在循环通过警报之前已将其注释掉。没有它,我看不到任何警报。
我需要做什么
alerts
仍将被填充而无需loadAlerts
在模板内调用(即,在模板内调用它created
或mounted
改为调用它)
OR
alerts
仍将被填充但[object Promise]
不显示
我猜,选项 1 可能更优雅和推荐的方式?
<template>
<div v-if="alerts">
<h4>{{ title }}</h4>
<!-- {{loadAlerts()}} -->
<li v-for="alert in alerts" class="alert">
{{ alert.name }}
</li>
</div>
</template>
export default {
data () {
return {
alerts: null
}
},
computed: {
...mapGetters('authentication', ['token']),
...mapGetters('user', ['profile']),
title () {
// Handle the null case
const alerts = this.alerts || []
return `My Alerts (${alerts.length})`
}
},
methods: {
// This needs to be in the methods, not a computed property
loadAlerts () {
return getUserAlert({
user_id: this.profile.user_id,
token: this.token
}).then(response => (this.alerts = response.data)).catch(
error => console.log(error)
)
}
},
// Initiate loading in a hook, not via the template
created () {
this.loadAlerts()
}
}
</script>
解决方案
应该没有理由调用模板中的函数。可能发生的事情是user_id
和/或在挂钩token
期间尚不可用。created
所以你不会看到任何结果。(通过提醒他们检查这一点——不要登录到控制台。)
当您将方法添加到模板时,如果稍后发生任何重新渲染,则将再次进行异步调用。在某些时候,可能会在可用时发生user_id
,token
因此您会看到数据。
由于这个原因,这也不是一个好的模式:每次重新渲染模板时都会对 API 进行另一次调用,即使在它工作一次之后也是如此。
一种解决方案是应该有一个来自user_id
/token
初始加载的承诺,您可以将其传递给该组件。然后created
钩子可以在then
那个promise中注册它的动作。
推荐阅读
- c# - C# DLL 的 System.Diagnostics.Debug.WriteLine 输出位置
- filter - PowerApps:根据前一个字段过滤查找字段
- f# - F#异步中的结果与提高?
- apache-camel - XA 事务支持 JBoss Widlfly 10、camel-2.15.3 和 Red Hat AMQ 7.2
- c# - 有没有办法配置在 Mono 上运行的自托管 Owin 应用程序的超时属性?
- mongodb - Mongodb 3.4 - 无法启动 mongodb
- django - 我是否需要 GeoServer(或类似服务器)在 Web 应用程序中提供形状文件?
- java - 如何从正在测试的方法中读取 application.properties 中的变量
- regex - 如何在 Python 中使用正则表达式将时间与天数匹配?
- mod-rewrite - Centos 7 + VestaCP mod 重写不起作用