vue父組件異步如何獲取數(shù)據(jù)傳給子組件
vue父組件異步獲取數(shù)據(jù)傳給子組件
最近一直在做一個vue移動端商城的實戰(zhàn),期間遇到一個小小的問題,值得一說,可能別人已經(jīng)遇到過了,只是我第一次遇到而已。
首頁有個樓層區(qū)域,用于展示不同類別的商品,
比如:水果,衣服,酒水等,布局都是一樣的,所以將單個樓層獨立出來成一個組件,只需要給響應(yīng)的樓層傳入對應(yīng)的數(shù)據(jù)就可以按需渲染了:
先在父組件引入,并注冊樓層組件
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>
在子組件里進行一下數(shù)據(jù)接收就行
props: ['floorGoods']
但是現(xiàn)在問題是父組件的數(shù)據(jù)是異步獲取的,而子組件一開始就會渲染,如果此時沒有傳入數(shù)據(jù),而子組件又要用到數(shù)據(jù)中的length屬性時就會報錯:
雖然頁面也能正常渲染,但是看到這個紅紅的報錯提示就不爽!
怎么辦呢?最簡單的辦法就是讓子組件條件渲染,當有數(shù)據(jù)的時候才渲染,這樣就不會拋出錯誤了。
但是這還不夠完美,子組件一般不直接使用父組件傳來的值,二是監(jiān)聽一下,然后有變化了的時候再賦值給data,渲染的時候用data里的數(shù)據(jù),這樣就能保證隨時動態(tài)更新數(shù)據(jù)
props: ['floorGoods'], data() { return{ flGoods: {} } }, watch: { floorGoods(val) { this.flGoods = val; console.log(val); } }
在一個方法就是在父組件里用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)致的報錯的情況會在各個場景出現(xiàn),比如根據(jù)數(shù)據(jù)渲染dom,而對dom有js操作的時候,會因為還沒渲染出來而找不到響應(yīng)的dom元素報錯,這里可以用vue提供的$nextTick()函數(shù),或者手動開個setTimeout定時器,延遲獲取;
使用better-scroll的時候因為dom沒有渲染出來而無法獲取滾動元素的高度,導(dǎo)致無法滾動,同樣可以用vue提供的這個函數(shù),等dom渲染完了后再初始化滾動。
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Flutter部件內(nèi)部狀態(tài)管理小結(jié)之實現(xiàn)Vue的v-model功能
本文是 Flutter 部件內(nèi)部狀態(tài)管理的小結(jié),從部件的基礎(chǔ)開始,到部件的狀態(tài)管理,并且在過程中實現(xiàn)一個類似 Vue 的 v-model 的功能,感興趣的朋友跟隨小編一起看看吧2019-06-06Vue2中pinia刷新后數(shù)據(jù)丟失的問題解決
Pinia是一個Vue.js狀態(tài)管理庫,如果你在組件中修改了store中的數(shù)據(jù)并刷新了界面,Pinia會將store中的數(shù)據(jù)重置為初始值,從而導(dǎo)致數(shù)據(jù)丟失的問題,本文就來介紹一下問題解決,感興趣的可以了解一下2023-12-12Vue3使用customRef封裝防抖函數(shù)的方法詳解
防抖函數(shù)的作用是高頻率觸發(fā)的事件,在指定的單位時間內(nèi),只響應(yīng)最后一次,如果在指定的時間內(nèi)再次觸發(fā),則重新計算時間,本文將給大家詳細的介紹一下Vue3使用customRef封裝防抖函數(shù)的方法,需要的朋友可以參考下2023-09-09vue 數(shù)據(jù)雙向綁定的實現(xiàn)方法
這篇文章主要介紹了vue 數(shù)據(jù)雙向綁定的實現(xiàn)方法,幫助大家更好的理解和學習使用vue框架,感興趣的朋友可以了解下2021-03-03