[英]Prop passed to child component is undefined in created method
我正在使用 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
是未定義的 3. CardComponent
created
掛鈎運行,記錄undefined
4. CardComponent
已安裝並且其已mounted
的掛鈎運行(與created
相同的日志記錄結果) 5. 您的父組件已安裝 6. 在此之后的某個時間點,異步請求解析並將place
從空數組更改為對象,可能具有card
屬性。 7. 新的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://v2.vuejs.org/v2/guide/instance.html#Lifecycle-Diagram
如果place
是一個對象,則不應將其初始化為數組。 此外,如果您的CardComponent
依賴於存在的數據,您可能希望有條件地呈現它。
例如
data () {
return { place: null }
}
和
<card-component v-if="place" :card="place.card"></card-component>
那么CardComponent
只會在place
有數據后創建和掛載。
確保你有props: true
在路由器文件中。 這是一個簡單的解決方案,但我們中的許多人都忘記了這一點。
{
path: '/path-to',
name: 'Name To',
component: Component,
props: true
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.