vue.js - 通过 props 将数据从父组件传递到子组件时,数据在子组件的挂载钩子中似乎未定义
问题描述
在我的父组件中:
<UsersList :current-room="current_room" />
在子组件中:
export default {
props: {
currentRoom: Object
},
data () {
return {
users: []
}
},
mounted () {
this.$nextTick( async () => {
console.log(this.currentRoom) // this, weirdly, has the data I expect, and id is set to 1
let url = `${process.env.VUE_APP_API_URL}/chat_room/${this.currentRoom.id}/users`
console.log(url) // the result: /api/chat_room/undefined/users
let response = await this.axios.get(url)
this.users = response.data
})
},
}
当我使用 vue-devtools 查看页面时,可以看到数据出现:
解决方案
我过去遇到过这个问题——和其他许多人一样。无论出于何种原因,您都不能依赖组件mounted
处理程序中可用的道具。我认为这与在Vue 的生命周期mounted()
中被调用的点有关。
我通过观察道具并将我的逻辑从mounted到watch handler解决了我的问题。在您的情况下,您可以查看该currentRoom
属性,并在处理程序中进行 api 调用:
export default {
props: {
currentRoom: Object
},
data() {
return {
users: []
}
},
watch: {
currentRoom(room) {
this.$nextTick(async() => {
let url = `${process.env.VUE_APP_API_URL}/chat_room/${room.id}/users`
let response = await this.axios.get(url)
this.users = response.data
})
}
},
}
我不认为你真的需要在$nextTick()
这里使用,但我把它留给了你。您可以尝试将其删除以简化代码。
顺便说一句,向console.log(this.currentRoom);
您显示房间 ID 的原因是因为当您将对象传递给 时console.log()
,它会绑定到该对象,直到它被读取。因此,即使在console.log()
调用时房间 ID 不可用,它也会在您在控制台中看到结果之前变为可用。
推荐阅读
- algorithm - 仅使用 90 度转弯和直线连接所有点
- excel - 从多个工作表中提取文本
- javascript - 这个弹窗搜索JavaScript如何添加自动关闭弹窗的代码?
- c++ - 如何检查字符串是否与数组元素匹配?
- java - 使用 java8 特性为字符串创建一个字符计数数组
- c# - 使用 MVVM 的 WPF 模态对话框
- c# - 如何在 ubuntu 上的 MonoDevelop 中引用 GTK 程序集
- r - ggplot 在一个绘图上填充两个渐变
- c# - Razor 页面命名空间与类库冲突
- javascript - DOM 节点和 javascript 命名空间有什么关系?