vue.js - 传递给子组件的道具在创建的方法中未定义
问题描述
我正在使用 Vue.js 2。
我在将值作为道具传递给子组件时遇到问题。我正在尝试传递card
给card-component
.
在card-component
我可以访问该Card goes here {{card}}
部分中的道具。
但是,当我尝试在created
或mounted
方法中访问它时,它是undefined
.
家长:
<template>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<card-component :card="place.card"></card-component>
</div>
</div>
</div>
</template>
<script>
import CostComponent from './CostComponent';
import CardComponent from './CardComponent';
export default {
components: {
CostComponent, CardComponent
},
props: ['id'],
data() {
return {
place: []
}
},
created() {
axios.get('/api/places/' + this.id)
.then(response => this.place = response.data);
}
}
</script>
孩子:
<template>
<div class="container">
<div class="row">
<div class="col-md-8 col-md-offset-2">
<ul class="list-unstyled">
Card goes here {{card}}
</ul>
</div>
</div>
</div>
</template>
<script>
import CardItemComponent from './CardItemComponent';
export default {
components: {
CardItemComponent
},
props: ['card'],
created() {
console.log(this.card); // undefined
},
mounted() {
console.log(this.card); // undefined
},
}
</script>
我做了很多谷歌搜索,但我找到的解决方案都没有解决我的问题。
解决方案
这纯粹是时间问题。这就是发生的事情......
- 您的父组件已创建。此时它分配了一个空数组
place
(这也是一个问题,但我稍后会谈到)。异步请求已启动 您的父组件通过其模板创建一个
CardComponent
实例<card-component :card="place.card"></card-component>
在这个阶段,
place
仍然是一个空数组,因此place.card
是未定义的CardComponent
created
钩子运行,记录undefined
- 已
CardComponent
安装并且它的mounted
钩子运行(与 相同的日志记录结果created
) - 您的父组件已安装
- 在此之后的某个时间点,异步请求解析并
place
从一个空数组更改为一个对象,可能带有一个card
属性。 - 新
card
属性被传递到你的CardComponent
,它反应性地更新{{ card }}
其模板中显示的值。
如果你想捕捉card
道具数据何时发生变化,你可以使用beforeUpdate
钩子
beforeUpdate () {
console.log(this.card)
}
演示
Vue.component('CardComponent', {
template: '<pre>card = {{ card }}</pre>',
props: ['card'],
created () {
console.log('created:', this.card)
},
mounted () {
console.log('mounted:', this.card)
},
beforeUpdate () {
console.log('beforeUpdate:', this.card)
}
})
new Vue({
el: '#app',
data: {
place: {}
},
created () {
setTimeout(() => {
this.place = { card: 'Ace of Spades' }
}, 2000)
}
})
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<div id="app">
<card-component :card="place.card" />
</div>
见https://vuejs.org/v2/guide/instance.html#Lifecycle-Diagram
如果place
它是一个对象,则不应将其初始化为数组。此外,如果您CardComponent
依赖于存在的数据,您可能希望有条件地呈现它。
例如
data () {
return { place: null }
}
和
<card-component v-if="place" :card="place.card"></card-component>
thenCardComponent
只会在有数据后创建和挂载。 place
推荐阅读
- ios - 单击 Mapkit 注释时视图不显示(Swift,iOS 14)
- php - samba 文件夹上的 www-data 权限被拒绝
- delphi - 当子窗体可见时如何防止执行主菜单操作
- matlab - 如何在 matlab 中理解 .sc .mat
- ios - 在 SiriShortcut 中,我如何处理布尔参数?
- javascript - 使用 Array.length 属性而不是函数通过仅计算不同元素而不是所有元素来返回数组的长度
- typescript - 是否可以在苗条的每个块内进行类型转换
- asp.net - axios获取对webforms webmethod的请求,返回html页面而不是json对象
- c++ - Gtk+ 3 (C) vs gtkmm 3 (CPP) ListStore->append() 的速度问题
- c# - 带队列的分布式锁