vue.js - 能够显示承诺的结果,但结果的长度显示为未定义
问题描述
我是 vue/promise 的新手,我很难理解为什么当我尝试显示一个 promise 的结果时,我最终得到了预期的数据,但是当我试图找出它的长度时,它说undefined
当我尝试显示来自 的警报时displayAlerts()
,我可以看到警报列表,总共 2 个。不过在computed
函数内title
出现${this.displayAlerts.length}
的样子undefined
,我是期待看到2
的。
它与displayAlerts()
导致承诺有关吗?如何修复代码,以便我得到2
而不是undefined
?
代码如下:
<template>
<div>
{{displayAlerts}}
<li v-for="alert in alerts" class="alert">
{{alert['name']}}
</li>
</div>
</template>
export default {
data () {
return {
alerts: null,
alert: new Alert(),
updatedAlert: new Alert(),
deletedAlert: new Alert(),
};
},
computed: {
...mapGetters("authentication",['token']),
...mapGetters("user",['profile']),
displayAlerts() {
return getUserAlert({
user_id: this.profile.user_id,
token: this.token
}).then(response => (this.alerts = response.data)).catch(
error => console.log(error)
)
},
title () {
return `My Alerts (${this.displayAlerts.length})`
},
test2() {
return [1,2,3]
},
}
};
</script>
解决方案
像这样的东西应该工作:
<template>
<div v-if="alerts">
<h4>{{ title }}</h4>
<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
displayAlerts () {
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.displayAlerts()
}
}
</script>
笔记:
- 计算属性不应该有副作用。任何异步都属于该类别。我
displayAlerts
改用了一种方法。 - 模板不应该有副作用。加载数据的调用应该在一个钩子中,例如
created
ormounted
。 title
需要访问this.alerts
而不是试图操纵承诺。- 在加载数据时, 的值
alerts
将是null
。你需要以某种方式处理它。我v-if
在模板中包含了 a 并在title
. 您可以选择以不同的方式处理它。 - 我已添加
title
到模板中,但这仅用于演示目的。当然,你可以用它做任何你想做的事情。 - 我假设您的原始
displayAlerts
功能正常工作并成功填充alerts
. 您可能希望将其重命名为更合适的名称,例如loadAlerts
.
推荐阅读
- c++ - 传递数组时出现分段错误
- cefsharp - 绑定对象不释放
- laravel - 突然间,我在测试中得到了 UnexpectedJavascriptException
- python - 如何将坐标从图像映射到 2D 表面
- angularjs - 如何使用 $resource POST 操作设置自定义标题?
- javascript - 看来我的 ajax 有效,但没有发布任何内容
- android - 如何在 Firebase 数据库子参考中使用字符串?
- c# - 需要 WCF 安全说明
- javascript - 如何在 JS 淡入淡出幻灯片中插入 CSS 转换旋转动画?
- corda - 在 corda 项目中创建 build.gradle 文件要遵循的步骤