最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue父組件異步傳遞props值,子組件接收不到解決方案

 更新時(shí)間:2022年10月20日 10:19:24   作者:Z.Dragon  
這篇文章主要介紹了vue父組件異步傳遞props值,子組件接收不到解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

父組件異步請(qǐng)求數(shù)據(jù)之后傳值給子組件,子組件接收不到

貼上父組件代碼圖:

組件

異步請(qǐng)求數(shù)據(jù)

事件

子組件代碼圖:

子組件

打印結(jié)果:

結(jié)果

父組件異步請(qǐng)求數(shù)據(jù)回來(lái)在傳到子組件,子組件無(wú)法接收,打印的依然是默認(rèn)值。

這里有兩種解決思路

第一種:子組件使用watch監(jiān)聽(tīng)

監(jiān)聽(tīng)

但是watch監(jiān)聽(tīng)也會(huì)有接收不到值的情況,因?yàn)橐薷膒rops的favoriteValue的值,favoriteValue接收不到的話(huà)就無(wú)法修改,所以這里同時(shí)給favoriteValue、isfavorite賦值,此時(shí)favoriteValue沒(méi)值,但是data的isfavorite有值,所以后面的修改favoriteValue值的操作有效。

第二種:父組件使用v-if判斷

v-if

定義flag

異步

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

不用watch監(jiān)聽(tīng)

結(jié)果

綜上就是解決父組件異步傳遞props值,子組件接收不到的問(wèn)題的解決方案,如果有更好的解決方案歡迎來(lái)撩

父組件傳遞props異步數(shù)據(jù)到子組件遇到的問(wèn)題

狀況一

父組件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ā)生改變(生命周期問(wèn)題)

案例二

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>
  子組件<!--這里很常見(jiàn)的一個(gè)問(wèn)題,就是{{childObject}}可以獲取且沒(méi)有報(bào)錯(cuò),但是{{childObject.items[0]}}不行,往往有個(gè)疑問(wèn)為什么前面獲取到值,后面獲取不到呢?-->
  <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ì)隨著父組件的值而改變,但是過(guò)程中會(huì)報(bào)錯(cuò)。

是因?yàn)椋菏紫葌鬟^(guò)來(lái)的是空,然后再異步刷新值,也就是開(kāi)始時(shí)候childObject.items[0]等同于’’.item[0]這樣的操作,

所以就會(huì)報(bào)下面的錯(cuò):

解決辦法:

1、使用v-if可以解決報(bào)錯(cuò)問(wèn)題和created為空問(wèn)題

父組件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>
  子組件<!--這里很常見(jiàn)的一個(gè)問(wèn)題,就是{{childObject}}可以獲取且沒(méi)有報(bào)錯(cuò),但是{{childObject.items[0]}}不行,往往有個(gè)疑問(wèn)為什么前面獲取到值,后面獲取不到呢?-->
  <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來(lái)監(jiān)聽(tīng)父組件改變的prop,使用methods來(lái)代替created

子組件 children

<template>
 <div>
  子組件<!--這里很常見(jiàn)的一個(gè)問(wèn)題,就是{{childObject}}可以獲取且沒(méi)有報(bào)錯(cuò),但是{{childObject.items[0]}}不行,往往有個(gè)疑問(wèn)為什么前面獲取到值,后面獲取不到呢?-->
  <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)聽(tīng)改變的值做其他事情的話(huà),只能搬到這里咯
      console.log(this.test)// 1
     }
    }
 }
</script>

3、子組件watch computed data 相結(jié)合(麻煩)

子組件children

<template>
 <div>
  子組件<!--這里很常見(jiàn)的一個(gè)問(wèn)題,就是{{childObject}}可以獲取且沒(méi)有報(bào)錯(cuò),但是{{childObject.items[0]}}不行,往往有個(gè)疑問(wèn)為什么前面獲取到值,后面獲取不到呢?-->
   <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來(lái)解決{{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)文章

最新評(píng)論

资讯 | 且末县| 襄汾县| 肃北| 酉阳| 临沧市| 吉水县| 忻州市| 蓝田县| 黑河市| 纳雍县| 阳泉市| 阿拉尔市| 凯里市| 星座| 浦东新区| 晴隆县| 香港 | 藁城市| 海丰县| 乡城县| 凤城市| 航空| 广灵县| 衡阳县| 高密市| 万安县| 西藏| 长沙市| 惠州市| 杨浦区| 拜城县| 大悟县| 宁都县| 景泰县| 清原| 通江县| 微山县| 酉阳| 长兴县| 泸水县|