Vue3之父子組件異步props數(shù)據(jù)的傳值方式
Vue3父子組件異步props數(shù)據(jù)的傳值
在寫(xiě)前端頁(yè)面時(shí)碰到一個(gè)問(wèn)題,就是點(diǎn)擊編輯按鈕傳遞這一行信息給子組件編輯頁(yè),展示該條數(shù)據(jù)詳細(xì)數(shù)據(jù);
但還沒(méi)有點(diǎn)擊編輯按鈕,其實(shí)編輯頁(yè)已經(jīng)初始化了,是因?yàn)樵诟附M件中已經(jīng)導(dǎo)入使用了該編輯頁(yè);
例如:在 Editor.vue中有這樣代碼:
let prop = defineProps(["dataInfo"]) console.log(prop.dataInfo);
進(jìn)入首頁(yè)時(shí)控制臺(tái)已經(jīng)運(yùn)行了這段代碼console.log(prop.dataInfo) 并且為空對(duì)象;

但是子組件并沒(méi)有接收到父組件的數(shù)據(jù);
原因
是因?yàn)槿绻附M件的props值是通過(guò)異步操作獲取的,那么在最初渲染子組件時(shí),props可能還沒(méi)有被賦值。而我正是使用異步操作把值通過(guò)props傳給子組件的;
代碼如下:
在父組件一個(gè)函數(shù)中給dataInfo賦值:
// 子組件標(biāo)簽
<Editor :dataInfo="dataInfo" ref="EditorRef" @refresh="funFindItemInfo" />
let EditorRef = ref()
let dataInfo = ref({}) //傳遞給編輯頁(yè)的數(shù)據(jù)
//編輯按鈕
function handlEditor(row) {
dataInfo.value = row; // 信息傳遞到組件
EditorRef.value.openEditor() //打開(kāi)對(duì)話(huà)框
}解決方案
這種情況下,可以使用watchEffect或watch來(lái)監(jiān)聽(tīng)props的變化,確保當(dāng)props值變化時(shí)能作出相應(yīng)的處理。
小結(jié):Vue 3中props的值在組件實(shí)例創(chuàng)建初期就被初始化并傳遞給子組件,并且在組件的整個(gè)生命周期內(nèi),只要父組件的props數(shù)據(jù)發(fā)生變化,就會(huì)觸發(fā)子組件的相應(yīng)更新。
總代碼如下:
- 父組件:
// 子組件標(biāo)簽
<Editor :dataInfo="dataInfo" ref="EditorRef" @refresh="funFindItemInfo" />
let EditorRef = ref()
let dataInfo = ref({}) //傳遞給編輯頁(yè)的數(shù)據(jù)
//編輯按鈕
function handlEditor(row) {
dataInfo.value = row; // 信息傳遞到組件
EditorRef.value.openEditor() //打開(kāi)對(duì)話(huà)框
}- 子組件:
// 標(biāo)簽:
<el-form-item label="ID">
<el-input v-model="ItemFormData.id" disabled></el-input>
</el-form-item>
<el-form-item label="名字">
<el-input v-model="ItemFormData.name"></el-input>
</el-form-item>
........
let prop = defineProps(["dataInfo"])
const emit = defineEmits(["refresh"])
let isDialog = ref(false) // 是否拉開(kāi)抽屜
let ItemFormData = ref({}) // 數(shù)據(jù)對(duì)象
defineExpose({
// 對(duì)外暴露控制拉開(kāi)抽屜的方法
openEditor() {
isDialog.value = true
},
});
watch(()=>prop.dataInfo,(newVal,oldVal)=>{
console.log("新值:",newVal);
console.log("舊值:",oldVal);
let {id,name,price,detail,pic,address,createtime} = prop.dataInfo //解構(gòu) 切斷響應(yīng)
ItemFormData.value = {id,name,price,detail,pic,address,createtime}
console.log("dada", ItemFormData.value);
})總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue2.x,vue3.x使用provide/inject注入的區(qū)別說(shuō)明
這篇文章主要介紹了vue2.x,vue3.x使用provide/inject注入的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
vue路由對(duì)不同界面進(jìn)行傳參及跳轉(zhuǎn)的總結(jié)
這篇文章主要介紹了vue路由對(duì)不同界面進(jìn)行傳參及跳轉(zhuǎn)的總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04
如何使用Vue3+Vite+TS快速搭建一套實(shí)用的腳手架
Vite是一個(gè)面向現(xiàn)代瀏覽器的一個(gè)更輕、更快的?Web?應(yīng)用開(kāi)發(fā)工具,下面這篇文章主要給大家介紹了關(guān)于如何使用Vue3+Vite+TS快速搭建一套實(shí)用腳手架的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10
vue實(shí)現(xiàn)簡(jiǎn)單無(wú)縫滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)簡(jiǎn)單無(wú)縫滾動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
vue中解決el-date-picker更改樣式不生效問(wèn)題
在使用Vue.js進(jìn)行前端開(kāi)發(fā)的過(guò)程中,Element?UI?是一個(gè)非常流行的UI庫(kù),它提供了一套完整的組件來(lái)快速搭建美觀的用戶(hù)界面,但是我們經(jīng)常遇到一個(gè)問(wèn)題使用Element?UI提供的el-date-picker組件時(shí),嘗試自定義其樣式卻無(wú)法生效,所以本文給大家介紹如何解決這個(gè)問(wèn)題2024-10-10
vue實(shí)現(xiàn)簡(jiǎn)易計(jì)時(shí)器組件
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)簡(jiǎn)易計(jì)時(shí)器組件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
詳解Vue3 Composition API中的提取和重用邏輯
這篇文章主要介紹了Vue3 Composition API中的提取和重用邏輯,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04

