Vue子組件props從父組件接收數(shù)據(jù)并存入data
經(jīng)過測試父組件中傳遞過來的數(shù)據(jù)有以下特點:
1.不允許直接修改
如果直接使用 this.xxx = action 操作的話 控制臺會報下面這個錯誤
大概的意思是 你小子不要隨便劈我瓜,我父組件的瓜豈是你能變的,父組件重新渲染時,這個值會被覆蓋,你小子自個兒用計算屬性或者data存一下吧
2.存在異步的情況
假如父組件該數(shù)據(jù)是后臺接口獲取的數(shù)據(jù),那么會產(chǎn)生這種情況。子組件的生命周期都已經(jīng)走完了,父組件的數(shù)據(jù)還沒傳過來。因為V8引擎的運行速度是很快的,萬分之一毫秒都等不了,如果是異步的話,子組件里是沒有辦法操作這個數(shù)據(jù)的。
父組件 <template> <div> <children :father="father"></children> </div> </template> <script> import children from "./children"; export default { components: { children }, data() { return { father: null }; }, mounted() { setTimeout(() => { this.father = { name: "父親" }; }, 1000); }, methods: {} }; </script>
子組件 <template> <div></div> </template> <script> export default { data() { return { student: { name: "張三" } }; }, props: { father: { type: Object, default: () => {} } }, watch: { father: { handler(newVal) { this.fatherData =newVal console.log(this.fatherData); }, deep: true, immediate: true } }, created() {}, mounted() { console.log(this.father); }, methods: {} }; </script>
解決思路
第一步
在父組件中使用子組件時,為子組件加上v-if='flag',初始賦值為flag=false,等待異步賦值操作完成后修改flag=true,這個操作不單單只試用于異步情況,建議只要涉及到數(shù)據(jù)流的操作與加工,都加上v-if限制,保證數(shù)據(jù)獲取到之后再開始運作子組件的生命周期。
//也可以這樣,簡潔一些 <div> <children v-if="father" :father="father"></children> </div>
第二步
在子組件中對props進(jìn)行watch監(jiān)聽,變化后立刻將newVal賦值到data中并保存起來
watch: { father: { handler(newVal) { this.fatherData =newVal console.log(this.fatherData); }, deep: true, immediate: true } },
這里還會出現(xiàn)一種額外的情況,就是watch中可以賦值到,也能打印出具體的值出來,但是一到其他生命周期中使用確是空,這個情況
這種情況可能是對象共享地址,或者數(shù)據(jù)正處于處理中,應(yīng)當(dāng)自行進(jìn)行深克隆一份進(jìn)行傳遞,一般只要方法寫得比較健壯,此種情況基本不會出現(xiàn)
到此這篇關(guān)于Vue子組件props從父組件接收數(shù)據(jù)并存入data的文章就介紹到這了,更多相關(guān)Vue props內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue+Minio實現(xiàn)多文件進(jìn)度上傳的詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于如何利用vue+Minio實現(xiàn)多文件進(jìn)度上傳的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-03-03vue用vis插件如何實現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D
這篇文章主要介紹了vue用vis插件如何實現(xiàn)網(wǎng)絡(luò)拓?fù)鋱D,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10vue?element-plus圖片預(yù)覽實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于vue?element-plus圖片預(yù)覽實現(xiàn)的相關(guān)資料,最近的項目中有圖片預(yù)覽的場景,也是踩了一些坑,在這里總結(jié)一下,需要的朋友可以參考下2023-07-07vue3 學(xué)習(xí)筆記之a(chǎn)xios的使用變化總結(jié)
本篇文章主要旨在幫助正在學(xué)vue3或者準(zhǔn)備學(xué)vue3的同學(xué)了解網(wǎng)絡(luò)請求axios該如何使用,防止接觸了一點點vue3的同學(xué)會有個疑問。有興趣的小伙伴可以關(guān)注一下2021-11-11基于vue+element實現(xiàn)全局loading過程詳解
這篇文章主要介紹了基于vue+element實現(xiàn)全局loading過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-07-07