Vue中的單向數(shù)據(jù)流原則詳解
Vue中的單向數(shù)據(jù)流原則
做一個(gè) ElementUI 彈框組件的二次封裝
- 效果如下:
點(diǎn)擊取消按鈕發(fā)現(xiàn)彈出如下報(bào)錯(cuò)信息
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "dialogVisible"
錯(cuò)誤的寫(xiě)法:
- 子組件 MyDialog3.vue
<!-- 子組件 --> <template> <!-- elmentui 的 Dialog --> <el-dialog :title=title :visible="dialogVisible"> <span slot="footer" class="dialog-footer"> <el-button @click="handleCancel">取 消</el-button> <el-button type="primary" @click="">確 定</el-button> </span> </el-dialog> </template> <script> export default { name: "MyDialog3", props: ['title', 'dialogVisible'], methods: { handleCancel() { this.dialogVisible = false; // 這是錯(cuò)誤的寫(xiě)法, 不能在子組件中直接修改props的值 } } } </script> <style scoped> </style>
- 父組件 MyDialog3Test.vue
<template> <div> <el-button @click="btnClick">點(diǎn)我彈框</el-button> <MyDialog3 :title="headerText" :dialog-visible="dialogShow"> </MyDialog3> </div> </template> <script> import MyDialog3 from "@/components/dialog3/MyDialog3"; export default { name: "MyDialog3Test", components: {MyDialog3}, data() { return { headerText: '測(cè)試彈框', dialogShow: false, } }, methods: { btnClick() { this.dialogShow = true; } } } </script> <style scoped> </style>
出現(xiàn)這個(gè)錯(cuò)誤的原因
是父子組件在進(jìn)行通信時(shí),子組件直接修改了 props的某個(gè)屬性的值。
在 Vue.js 中,直接修改 prop(屬性)的值是被嚴(yán)格禁止的,因?yàn)檫@會(huì)導(dǎo)致父子組件之間的數(shù)據(jù)流變得難以追蹤和調(diào)試。Vue 設(shè)計(jì)之初就采用了單向數(shù)據(jù)流的原則,即父組件通過(guò) prop 向下傳遞數(shù)據(jù)到子組件,而子組件應(yīng)該通過(guò)事件(如自定義事件)來(lái)通知父組件更新數(shù)據(jù),而不是直接修改 prop 的值。
正確的寫(xiě)法如下:
在子組件中取消按鈕的點(diǎn)擊事件中不修改 dialogVisible 屬性的值, 而是通過(guò) $emit 發(fā)送一個(gè)自定義事件 dialog-close, 在父組件中使用 @dialog-close 去申明處理這個(gè)事件. 代碼如下:
- 子組件:
- 父組件:
總結(jié)
在 Vue.js 中,單向數(shù)據(jù)流(One-Way Data Flow)是一個(gè)重要的設(shè)計(jì)理念,指的是數(shù)據(jù)從父組件通過(guò) props 向下傳遞給子組件,而子組件不能直接修改這些數(shù)據(jù)。
如果子組件需要修改數(shù)據(jù),應(yīng)該通過(guò)事件通知父組件,由父組件更新數(shù)據(jù)。這種機(jī)制確保了組件之間的關(guān)系清晰,易于維護(hù)。
相關(guān)文章
VueX瀏覽器刷新如何實(shí)現(xiàn)保存數(shù)據(jù)
這篇文章主要介紹了VueX瀏覽器刷新如何實(shí)現(xiàn)保存數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07vue結(jié)合vant實(shí)現(xiàn)聯(lián)動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了vue結(jié)合vant實(shí)現(xiàn)聯(lián)動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01elementUI中input回車(chē)觸發(fā)頁(yè)面刷新問(wèn)題與解決方法
這篇文章主要給大家介紹了關(guān)于elementUI中input回車(chē)觸發(fā)頁(yè)面刷新問(wèn)題與解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用elementUI具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-07-07vue使用echarts如何實(shí)現(xiàn)雙柱狀圖和雙y軸的柱狀圖
這篇文章主要介紹了vue使用echarts如何實(shí)現(xiàn)雙柱狀圖和雙y軸的柱狀圖問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10Vue使用video標(biāo)簽實(shí)現(xiàn)視頻播放
這篇文章主要為大家詳細(xì)介紹了Vue使用video標(biāo)簽實(shí)現(xiàn)視頻播放,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09使用vue實(shí)現(xiàn)pdf預(yù)覽功能的方法
許多朋友想要材料上傳之后點(diǎn)擊預(yù)覽實(shí)現(xiàn)在瀏覽器上預(yù)覽的效果,所以本文將給大家介紹如何使用vue實(shí)現(xiàn)pdf預(yù)覽功能,文中有實(shí)現(xiàn)代碼,有需要的朋友可以參考閱讀下2023-08-08Vue項(xiàng)目本地沒(méi)有問(wèn)題但部署到服務(wù)器上提示錯(cuò)誤(問(wèn)題解決方案)
一個(gè) VUE 的項(xiàng)目在本地部署沒(méi)有問(wèn)題,但是部署到服務(wù)器上的時(shí)候提示訪問(wèn)資源的錯(cuò)誤,遇到這樣的問(wèn)題如何解決呢?下面小編給大家?guī)?lái)了Vue項(xiàng)目本地沒(méi)有問(wèn)題但部署到服務(wù)器上提示錯(cuò)誤的解決方法,感興趣的朋友一起看看吧2023-05-05使用vue3.2實(shí)現(xiàn)多頁(yè)簽導(dǎo)航
這篇文章主要為大家詳細(xì)介紹了如何使用vue3.2 + elementPlus + pinia 實(shí)現(xiàn)多頁(yè)簽導(dǎo)航,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下2023-12-12