vue父組件異步如何獲取數(shù)據(jù)傳給子組件
vue父組件異步獲取數(shù)據(jù)傳給子組件
最近一直在做一個(gè)vue移動(dòng)端商城的實(shí)戰(zhàn),期間遇到一個(gè)小小的問(wèn)題,值得一說(shuō),可能別人已經(jīng)遇到過(guò)了,只是我第一次遇到而已。
首頁(yè)有個(gè)樓層區(qū)域,用于展示不同類(lèi)別的商品,
比如:水果,衣服,酒水等,布局都是一樣的,所以將單個(gè)樓層獨(dú)立出來(lái)成一個(gè)組件,只需要給響應(yīng)的樓層傳入對(duì)應(yīng)的數(shù)據(jù)就可以按需渲染了:
先在父組件引入,并注冊(cè)樓層組件
import Floor from '@/components/pages/common/Floor'
components: { swiper, swiperSlide, Floor }
數(shù)據(jù)初始化
data() { return { locationIcon: require('../../assets/images/location.png'), bannerSwipePics: [], category: [], adBar: '', recommendGoods: [], swiperOptions: { slidesPerView: 3 }, floorSeafood: {}, floorBeverage: {}, floorFruits: {} } },
使用組件
<!--樓層--> <Floor :floorGoods='floorSeafood'></Floor> <Floor :floorGoods='floorBeverage'></Floor> <Floor :floorGoods='floorFruits'></Floor>
在子組件里進(jìn)行一下數(shù)據(jù)接收就行
props: ['floorGoods']
但是現(xiàn)在問(wèn)題是父組件的數(shù)據(jù)是異步獲取的,而子組件一開(kāi)始就會(huì)渲染,如果此時(shí)沒(méi)有傳入數(shù)據(jù),而子組件又要用到數(shù)據(jù)中的length屬性時(shí)就會(huì)報(bào)錯(cuò):
雖然頁(yè)面也能正常渲染,但是看到這個(gè)紅紅的報(bào)錯(cuò)提示就不爽!
怎么辦呢?最簡(jiǎn)單的辦法就是讓子組件條件渲染,當(dāng)有數(shù)據(jù)的時(shí)候才渲染,這樣就不會(huì)拋出錯(cuò)誤了。
但是這還不夠完美,子組件一般不直接使用父組件傳來(lái)的值,二是監(jiān)聽(tīng)一下,然后有變化了的時(shí)候再賦值給data,渲染的時(shí)候用data里的數(shù)據(jù),這樣就能保證隨時(shí)動(dòng)態(tài)更新數(shù)據(jù)
props: ['floorGoods'], data() { return{ flGoods: {} } }, watch: { floorGoods(val) { this.flGoods = val; console.log(val); } }
在一個(gè)方法就是在父組件里用Promise方法異步執(zhí)行數(shù)據(jù)的賦值:
new Promise((resolve,reject) => { if (res.status === 200){ resolve(res); } }).then((res) => { this.category = res.data.data.category; this.adBar = res.data.data.advertesPicture.PICTURE_ADDRESS; this.bannerSwipePics = res.data.data.slides; this.recommendGoods = res.data.data.recommend; // 也可異步獲取再傳給子組件 Promise this.floorSeafood = res.data.data.floor1; this.floorBeverage = res.data.data.floor2; this.floorFruits = res.data.data.floor3; console.log(this.floorFruits); this._initScroll(); }) }).catch(err => { console.log(err); });
這樣也是可以的,異步獲取數(shù)據(jù)導(dǎo)致的報(bào)錯(cuò)的情況會(huì)在各個(gè)場(chǎng)景出現(xiàn),比如根據(jù)數(shù)據(jù)渲染dom,而對(duì)dom有js操作的時(shí)候,會(huì)因?yàn)檫€沒(méi)渲染出來(lái)而找不到響應(yīng)的dom元素報(bào)錯(cuò),這里可以用vue提供的$nextTick()函數(shù),或者手動(dòng)開(kāi)個(gè)setTimeout定時(shí)器,延遲獲取;
使用better-scroll的時(shí)候因?yàn)閐om沒(méi)有渲染出來(lái)而無(wú)法獲取滾動(dòng)元素的高度,導(dǎo)致無(wú)法滾動(dòng),同樣可以用vue提供的這個(gè)函數(shù),等dom渲染完了后再初始化滾動(dòng)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Flutter部件內(nèi)部狀態(tài)管理小結(jié)之實(shí)現(xiàn)Vue的v-model功能
本文是 Flutter 部件內(nèi)部狀態(tài)管理的小結(jié),從部件的基礎(chǔ)開(kāi)始,到部件的狀態(tài)管理,并且在過(guò)程中實(shí)現(xiàn)一個(gè)類(lèi)似 Vue 的 v-model 的功能,感興趣的朋友跟隨小編一起看看吧2019-06-06Vue2中pinia刷新后數(shù)據(jù)丟失的問(wèn)題解決
Pinia是一個(gè)Vue.js狀態(tài)管理庫(kù),如果你在組件中修改了store中的數(shù)據(jù)并刷新了界面,Pinia會(huì)將store中的數(shù)據(jù)重置為初始值,從而導(dǎo)致數(shù)據(jù)丟失的問(wèn)題,本文就來(lái)介紹一下問(wèn)題解決,感興趣的可以了解一下2023-12-12Vue3使用customRef封裝防抖函數(shù)的方法詳解
防抖函數(shù)的作用是高頻率觸發(fā)的事件,在指定的單位時(shí)間內(nèi),只響應(yīng)最后一次,如果在指定的時(shí)間內(nèi)再次觸發(fā),則重新計(jì)算時(shí)間,本文將給大家詳細(xì)的介紹一下Vue3使用customRef封裝防抖函數(shù)的方法,需要的朋友可以參考下2023-09-09vue 數(shù)據(jù)雙向綁定的實(shí)現(xiàn)方法
這篇文章主要介紹了vue 數(shù)據(jù)雙向綁定的實(shí)現(xiàn)方法,幫助大家更好的理解和學(xué)習(xí)使用vue框架,感興趣的朋友可以了解下2021-03-03vue2左側(cè)菜單欄收縮展開(kāi)功能實(shí)現(xiàn)
vue2左側(cè)菜單欄收縮展開(kāi)目前是非常常見(jiàn)的,我們?cè)谌粘i_(kāi)發(fā)過(guò)程中經(jīng)常會(huì)碰到,這篇文章給大家介紹vue2左側(cè)菜單欄收縮展開(kāi)功能,感興趣的朋友跟隨小編一起看看吧2024-04-04