Vue中的Props(不可變狀態(tài))
組件接受的選項(xiàng)大部分與Vue實(shí)例一樣,而選項(xiàng)props是組件中非常重要的一個(gè)選項(xiàng)。在 Vue 中,父子組件的關(guān)系可以總結(jié)為 props down, events up。父組件通過 props 向下傳遞數(shù)據(jù)給子組件,子組件通過 events 給父組件發(fā)送消息。接下來通過本文給大家介紹Vue中Props,一起看看吧!

單向數(shù)據(jù)流
所有的 prop 都使得其父子 prop 之間形成了一個(gè)單向下行綁定:父級(jí) prop 的更新會(huì)向下流動(dòng)到子組件中,但是反過來則不行。這樣會(huì)防止從子組件意外改變父級(jí)組件的狀態(tài),從而導(dǎo)致你的應(yīng)用的數(shù)據(jù)流向難以理解。
額外的,每次父級(jí)組件發(fā)生更新時(shí),子組件中所有的 prop 都將會(huì)刷新為最新的值。這意味著你不應(yīng)該在一個(gè)子組件內(nèi)部改變 prop。如果你這樣做了,Vue 會(huì)在瀏覽器的控制臺(tái)中發(fā)出警告。
問題
下面簡要說一下上面發(fā)生的警告現(xiàn)象,或許大多數(shù)人都遇到過.
使用場景
父組件
<BackLogModal :isModalOpen="isModalOpen" @closeModal="handleCloseModal"> </BackLogModal>
- BackLogModal為一個(gè)彈窗組件,通過isModalOpen決定彈窗的開閉狀態(tài)
- 傳入的isModalOpen是父組件的一個(gè)變量,類型為boolean
- closeModal監(jiān)聽子組件派發(fā)的自定義事件closeModal
子組件
// 使用了typescript
export default class BackLogModal extends Vue {
@Prop()
private isModalOpen: boolean;
private handleConfirm(): void {
this.$Message.info('Clicked ok');
this.$emit('closeModal');
}
private handleClose(): void {
this.$Message.info('Clicked cancal');
this.$emit('closeModal');
}
}
- 通過@Prop()注解獲取父組件傳遞過來的isModalOpen屬性
- 頁面 通過v-model與屬性isModalOpen進(jìn)行綁定
- 由于彈窗組件在關(guān)閉時(shí)會(huì)自動(dòng)設(shè)置isModalOpen的值為false,這里直接修改的就是父組件傳入的isModalOpen屬性,由于props屬性是單向數(shù)據(jù)流,具有不可變狀態(tài),這是頁面就會(huì)拋出警告
解決問題
export default class BackLogModal extends Vue {
private isOpen: boolean = false;
@Prop()
private isModalOpen: boolean;
@Watch('isModalOpen')
private watchModalOpen(newVal: boolean, oldVal: boolean) {
console.log(newVal, oldVal);
if (newVal !== oldVal) {
this.isOpen = newVal;
}
}
private handleConfirm(): void {
this.$Message.info('Clicked ok');
this.$emit('closeModal');
}
private handleClose(): void {
this.$Message.info('Clicked cancal');
this.$emit('closeModal');
}
}
- 定義一個(gè)子組件私有變量isOpen與頁面彈窗就行綁定
- 使用@Watch('isModalOpen')監(jiān)聽父組件傳入的isModalOpen屬性,一旦值發(fā)生改變,便更新本地變量isOpen,確保彈窗的正常的打開與關(guān)閉
以上所述是小編給大家介紹的Vue中的Props(不可變狀態(tài)),希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
vue源碼學(xué)習(xí)之Object.defineProperty 對(duì)數(shù)組監(jiān)聽
這篇文章主要介紹了vue源碼學(xué)習(xí)之Object.defineProperty 對(duì)數(shù)組監(jiān)聽,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05
vue儲(chǔ)存storage時(shí)含有布爾值的解決方案
這篇文章主要介紹了vue儲(chǔ)存storage時(shí)含有布爾值的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
VUE子組件向父組件傳值詳解(含傳多值及添加額外參數(shù)場景)
這篇文章主要給大家介紹了關(guān)于VUE子組件向父組件傳值(含傳多值及添加額外參數(shù)場景)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Vue3哈希模式實(shí)現(xiàn)錨點(diǎn)導(dǎo)航方式
這篇文章主要介紹了Vue3哈希模式實(shí)現(xiàn)錨點(diǎn)導(dǎo)航方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04
基于vue實(shí)現(xiàn)動(dòng)態(tài)Tab標(biāo)簽頁功能
這篇文章主要介紹了如何基于vue實(shí)現(xiàn)動(dòng)態(tài)Tab標(biāo)簽頁功能,文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-09-09

