vue單向數(shù)據(jù)流的深入講解
vue單向數(shù)據(jù)流
在vue中需要遵循單向數(shù)據(jù)流原則
- 在父傳子的前提下,父組件的數(shù)據(jù)發(fā)生會通知子組件自動更新
- 子組件內(nèi)部,不能直接修改父組件傳遞過來的props => props是只讀的
代碼示例
父組件代碼:
<template> <div style="border: 1px solid #000"> <h1>我是父組件</h1> <Son :info="info" :person="person"></Son> <button @click="fn">修改數(shù)據(jù)(父)</button> </div> </template> <script> import Son from "./Son.vue"; export default { data() { return { info: "我是父組件中的數(shù)據(jù)", person: ["張三", "李四", "趙六"], }; }, components: { Son, }, methods: { fn() { this.info = "我是父組件中點擊修改后的數(shù)據(jù)"; }, }, }; </script> <style scoped> </style>
子組件代碼:
<template> <div> <h2>我是子組件</h2> <p>{{ info }}</p> <p v-for="(item, index) in person" :key="index">{{ item }}</p> <button @click="fn">修改數(shù)據(jù)(子)</button> </div> </template> <script> export default { props: ["info", "person"], methods: { fn() { // 修改基本數(shù)據(jù)類型 this.info = this.info + ",我現(xiàn)在被傳遞到子組件中"; // 修改引用數(shù)據(jù)類型 // this.person.push("韓七"); }, }, }; </script> <style scoped> div { border: 1px solid red; margin: 10px; } </style>
當我們在父組件中點擊按鈕時,會將父組件中的數(shù)據(jù)進行修改,這樣子組件通過props接收的數(shù)據(jù)也會隨之改變,這就印證了vue遵循單向數(shù)據(jù)流的第一條原則,在父傳子的前提下,父組件的數(shù)據(jù)發(fā)生變化會通知子組件自動更新
當我們在子組件中點擊按鈕時,我們將父組件傳遞過來的數(shù)據(jù)進行修改,此時在子組件中數(shù)據(jù)得到修改,但是會報錯,并且,父組件中的數(shù)據(jù)不會發(fā)生改變
然后我們用vue調(diào)試工具再來看一下,子組件中的數(shù)據(jù)發(fā)生變化,父組件的數(shù)據(jù)有沒有跟著一起變化
從上面可見知道,父組件的數(shù)據(jù)發(fā)生變化會通知子組件自動更新,但是修改子組件通過props從父組件接收的數(shù)據(jù)時,它不會通知父組件自動更新,
特殊情況
上面講述的是將基本數(shù)據(jù)類型改變會報錯,那么將引用數(shù)據(jù)類型改變會不會報錯呢,答案是否定的,如果父組件傳給子組件的是一個引用數(shù)據(jù)類型,這里用數(shù)組為例,子組件修改數(shù)組內(nèi)的元素,是不會報錯的,數(shù)組是引用類型,互相更新,但不能改變引用地址,下面看一下效果
先將子組件內(nèi)的點擊事件處理函數(shù)要改變的數(shù)據(jù)從基本數(shù)據(jù)類型改為引用數(shù)據(jù)類型,然后點擊按鈕來看一下父組件和子組件中的數(shù)據(jù)有沒有同步更新
這樣就驗證了數(shù)據(jù)需要遵循單向數(shù)據(jù)流原則的第二點(特殊情況除外),通過子組件直接修改父組件傳遞過來的props,這樣是非常不建議的,他會影響后續(xù)不同狀態(tài)下數(shù)據(jù)。
注意點:
在vue中需要遵循單向數(shù)據(jù)流原則
- 在父傳子的前提下,父組件的數(shù)據(jù)發(fā)生會通知子組件自動更新
- 子組件內(nèi)部,不能直接修改父組件傳遞過來的props => props是只讀的
最后說明下 : 父組件傳給子組件的是一個對象,子組件修改對象的屬性,是不會報錯的,對象是引用類型, 互相更新;但不能改變引用地址.
總結(jié)
到此這篇關(guān)于vue單向數(shù)據(jù)流的文章就介紹到這了,更多相關(guān)vue單向數(shù)據(jù)流內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue@cli3項目模板怎么使用public目錄下的靜態(tài)文件
這篇文章主要介紹了vue@cli3項目模板怎么使用public目錄下的靜態(tài)文件,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07詳解基于element的區(qū)間選擇組件校驗(交易金額)
這篇文章主要介紹了詳解基于element的區(qū)間選擇組件校驗(交易金額),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01vue中axios實現(xiàn)數(shù)據(jù)交互與跨域問題
這篇文章主要介紹了vue中axios實現(xiàn)數(shù)據(jù)交互與跨域問題,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-05-05vue2.0/3.0中provide和inject的用法示例
provide和inject是成對出現(xiàn)的,主要用于父組件向子孫組件傳遞數(shù)據(jù),這篇文章主要給大家介紹了關(guān)于vue2.0/3.0中provide和inject用法的相關(guān)資料,需要的朋友可以參考下2021-09-09詳解基于iview-ui的導(dǎo)航欄路徑(面包屑)配置
這篇文章主要介紹了詳解基于iview-ui的導(dǎo)航欄路徑(面包屑)配置,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-02-02Vuejs第九篇之組件作用域及props數(shù)據(jù)傳遞實例詳解
這篇文章主要介紹了Vuejs第九篇之組件作用域及props數(shù)據(jù)傳遞實例詳解的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-09-09