vue父組件異步傳遞props值,子組件接收不到解決方案
父組件異步請(qǐng)求數(shù)據(jù)之后傳值給子組件,子組件接收不到
貼上父組件代碼圖:



子組件代碼圖:

打印結(jié)果:

父組件異步請(qǐng)求數(shù)據(jù)回來在傳到子組件,子組件無法接收,打印的依然是默認(rèn)值。
這里有兩種解決思路
第一種:子組件使用watch監(jiān)聽

但是watch監(jiān)聽也會(huì)有接收不到值的情況,因?yàn)橐薷膒rops的favoriteValue的值,favoriteValue接收不到的話就無法修改,所以這里同時(shí)給favoriteValue、isfavorite賦值,此時(shí)favoriteValue沒值,但是data的isfavorite有值,所以后面的修改favoriteValue值的操作有效。
第二種:父組件使用v-if判斷



定義flag默認(rèn)值false,異步之后設(shè)為true是為了確保數(shù)據(jù)有值,這樣一來子組件里就不用watch監(jiān)聽數(shù)據(jù)啦

結(jié)果

綜上就是解決父組件異步傳遞props值,子組件接收不到的問題的解決方案,如果有更好的解決方案歡迎來撩
父組件傳遞props異步數(shù)據(jù)到子組件遇到的問題
狀況一
父組件parent.vue
// asyncData為異步獲取的數(shù)據(jù),想傳遞給子組件使用
<template>
<div>
父組件
<child :child-data="asyncData"></child>
</div>
</template>
<script>
import child from '../demo/children.vue'
export default {
data: () => ({
asyncData: ''
}),
components: {
child
},
created () {
},
mounted () {
// setTimeout模擬異步數(shù)據(jù)
setTimeout(() => {
this.asyncData = ' async data'
console.log('parent 組件結(jié)束')
}, 2000)
}
}
</script>
子組件child.vue
<template>
<div>
子組件{{childData}}
</div>
</template>
<script>
export default {
props: ['childData'],
data: () => ({
}),
created () {
console.log("子組件created----- "+this.childData) // 空值
},
methods: {
}
}
</script>
子組件的html中的{{childData}}的值會(huì)隨著父組件的值而改變

但是created里面的卻不會(huì)發(fā)生改變(生命周期問題)

案例二
parent.vue
<template>
<div>
父組件
<child :child-object="asyncObject"></child>
</div>
</template>
<script>
import child from '../demo1/children.vue'
export default {
data: () => ({
asyncObject: ''
}),
components: {
child
},
created () {
},
mounted () {
// setTimeout模擬異步數(shù)據(jù)
setTimeout(() => {
this.asyncObject = {'items': [1, 2, 3]}
console.log('parent 結(jié)束')
}, 2000)
}
}
</script>
子組件 children
<template>
<div>
子組件<!--這里很常見的一個(gè)問題,就是{{childObject}}可以獲取且沒有報(bào)錯(cuò),但是{{childObject.items[0]}}不行,往往有個(gè)疑問為什么前面獲取到值,后面獲取不到呢?-->
<p>{{childObject.items[0]}}</p>
</div>
</template>
<script>
export default {
props: ['childObject'],
data: () => ({
}),
created () {
console.log(this.childObject) // 空值
},
methods: {
}
}
</script>
created里面的卻不會(huì)發(fā)生改變, 子組件的html中的{{{childObject.items[0]}}的值雖然會(huì)隨著父組件的值而改變,但是過程中會(huì)報(bào)錯(cuò)。
是因?yàn)椋菏紫葌鬟^來的是空,然后再異步刷新值,也就是開始時(shí)候childObject.items[0]等同于’’.item[0]這樣的操作,
所以就會(huì)報(bào)下面的錯(cuò):

解決辦法:
1、使用v-if可以解決報(bào)錯(cuò)問題和created為空問題
父組件parent
<template>
<div>
父組件
<child :child-object="asyncObject" v-if="flag"></child>
</div>
</template>
<script>
import child from '../demo1/children.vue'
export default {
data: () => ({
asyncObject: '',
flag:false
}),
components: {
child
},
created () {
},
mounted () {
// setTimeout模擬異步數(shù)據(jù)
setTimeout(() => {
this.asyncObject = {'items': [1, 2, 3]}
this.flag= true
console.log('parent 結(jié)束')
}, 2000)
}
}
</script>
子頁(yè)面 children
<template>
<div>
子組件<!--這里很常見的一個(gè)問題,就是{{childObject}}可以獲取且沒有報(bào)錯(cuò),但是{{childObject.items[0]}}不行,往往有個(gè)疑問為什么前面獲取到值,后面獲取不到呢?-->
<p>{{childObject.items[0]}}</p>
</div>
</template>
<script>
export default {
props: ['childObject'],
data: () => ({
}),
created () {
console.log("子組件create-----"+JSON.stringify(this.childObject)) // 空值
},
methods: {
}
}
</script>

2、子組件使用watch來監(jiān)聽父組件改變的prop,使用methods來代替created
子組件 children
<template>
<div>
子組件<!--這里很常見的一個(gè)問題,就是{{childObject}}可以獲取且沒有報(bào)錯(cuò),但是{{childObject.items[0]}}不行,往往有個(gè)疑問為什么前面獲取到值,后面獲取不到呢?-->
<p>{{test}}</p>
</div>
</template>
<script>
export default {
props: ['childObject'],
data: () => ({
test: ''
}),
watch: {
'childObject.items': function (n, o) {
this.test = n[0]
this.updata()
}
},
methods: {
updata () { // 既然created只會(huì)執(zhí)行一次,但是又想監(jiān)聽改變的值做其他事情的話,只能搬到這里咯
console.log(this.test)// 1
}
}
}
</script>

3、子組件watch computed data 相結(jié)合(麻煩)
子組件children
<template>
<div>
子組件<!--這里很常見的一個(gè)問題,就是{{childObject}}可以獲取且沒有報(bào)錯(cuò),但是{{childObject.items[0]}}不行,往往有個(gè)疑問為什么前面獲取到值,后面獲取不到呢?-->
<p>{{test}}</p>
</div>
</template>
<script>
export default {
props: ['childObject'],
data: () => ({
test: ''
}),
watch: {
'childObject.items': function (n, o) {
this._test = n[0]
}
},
computed: {
_test: {
set (value) {
this.update()
this.test = value
},
get () {
return this.test
}
}
},
methods: {
update () {
console.log(this.childObject) // {items: [1,2,3]}
}
}
}
</script>

4、使用prop default來解決{{childObject.items[0]}}
父組件:
<template>
<div>
父組件
<child :child-object="asyncObject"></child>
</div>
</template>
<script>
import child from '../demo4/children.vue'
export default {
data: () => ({
asyncObject: undefined // 這里使用null反而報(bào)0的錯(cuò)
}),
components: {
child
},
created () {
},
mounted () {
// setTimeout模擬異步數(shù)據(jù)
setTimeout(() => {
this.asyncObject = {'items': [1, 2, 3]}
console.log('parent finish')
}, 2000)
}
}
</script>
子組件:
<template>
<div>
子組件<!--1-->
<p>{{childObject.items[0]}}</p>
</div>
</template>
<script>
export default {
props: {
childObject: {
type: Object,
default () {
return {
items: ''
}
}
}
},
data: () => ({
}),
created () {
console.log(this.childObject) // {item: ''}
}
}
</script>

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
當(dāng)啟動(dòng)vue項(xiàng)目安裝依賴時(shí)報(bào)錯(cuò)的解決方案
這篇文章主要介紹了當(dāng)啟動(dòng)vue項(xiàng)目安裝依賴時(shí)報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04
詳解TypeScript+Vue 插件 vue-class-component的使用總結(jié)
這篇文章主要介紹了TypeScript+Vue 插件 vue-class-component的使用總結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-02-02
vue-cli3+echarts實(shí)現(xiàn)漸變色儀表盤組件封裝
這篇文章主要為大家詳細(xì)介紹了vue-cli3+echarts實(shí)現(xiàn)漸變色儀表盤組件封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
vue3學(xué)習(xí)指導(dǎo)教程(附帶獲取屏幕可視區(qū)域?qū)捀?
Vue3是Vue的第三個(gè)版本更快,更輕,易維護(hù),更多的原生支持,下面這篇文章主要給大家介紹了關(guān)于vue3學(xué)習(xí)指導(dǎo)教程(附帶獲取屏幕可視區(qū)域?qū)捀?的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-04-04
vuejs使用$emit和$on進(jìn)行組件之間的傳值的示例
本篇文章主要介紹了vuejs使用$emit和$on進(jìn)行組件之間的傳值的示例,具有一定的參考價(jià)值,有興趣的可以了解一下2017-10-10
vue+springmvc導(dǎo)出excel數(shù)據(jù)的實(shí)現(xiàn)代碼
這篇文章主要介紹了vue+springmvc導(dǎo)出excel數(shù)據(jù)的實(shí)現(xiàn)代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06
如何用VUE和Canvas實(shí)現(xiàn)雷霆戰(zhàn)機(jī)打字類小游戲
這篇文章主要介紹了如何用VUE和Canvas實(shí)現(xiàn)雷霆戰(zhàn)機(jī)打字類小游戲,麻雀雖小,五臟俱全,對(duì)游戲感興趣的同學(xué),可以參考下,研究里面的原理和實(shí)現(xiàn)方法2021-04-04
Vue3?使用v-md-editor如何動(dòng)態(tài)上傳圖片的方法實(shí)現(xiàn)
本文主要介紹了Vue3?使用v-md-editor如何動(dòng)態(tài)上傳圖片,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08
從0到1構(gòu)建vueSSR項(xiàng)目之路由的構(gòu)建
這篇文章主要介紹了從0到1構(gòu)建vueSSR項(xiàng)目之路由的構(gòu)建,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03
vue基于Echarts的拖拽數(shù)據(jù)可視化功能實(shí)現(xiàn)
這篇文章主要給大家介紹了關(guān)于vue基于Echars的拖拽數(shù)據(jù)可視化功能實(shí)現(xiàn)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

