父子組件間單向數(shù)據(jù)流的解決辦法

上一篇:父子組件間傳值

在上一篇中講解了父子組件之間是如何傳值的桐汤,如果子組件需要改變傳過來的數(shù)據(jù)供自己使用而克,或者想在子組件中改變傳過來的數(shù)據(jù)并同步到父組件,那么直接改肯定是不行的怔毛,如果你這么做了员萍,Vue 會(huì)在控制臺(tái)給出警告。

對(duì)應(yīng)這兩種情況拣度,解決方式如下:

先創(chuàng)建項(xiàng)目并運(yùn)行

vue init webpack-simple template
cd template
npm i
npm run dev

一碎绎、 子組件需要改變傳過來的數(shù)據(jù)供自己使用
1. 定義一個(gè)局部變量,并用 props 的值來初始化它

在 App.vue 中

<template>
    <div class="hello">
        <h3>我是 App 父組件</h3>
        <h4>訪問自己的數(shù)據(jù):{{msg}},{{name}},{{user.id}}</h4>
        <hr>
        <!-- 1. 在調(diào)用子組件時(shí)抗果,綁定想要獲取的父組件中的數(shù)據(jù) -->
        <Hello :message="msg"></Hello>
    </div>
</template>

<script>
// 引入 Hello 組件
import Hello from './assets/components/Hello.vue'
export default {
  data(){
    return {
      msg:'父組件',
      name:'tom',
      age:'22',
      user:{
        id:1234,
        userName:'Jack'
      }
    }
  },
  // 注冊(cè) Hello 組件
  components:{
    Hello
  }
}
</script>

在 Hello.vue 中

<template>
    <div class="hello">
        <h3>我是 hello 子組件</h3>
        <!-- 在頁(yè)面中直接渲染即可 -->
        <h4>訪問父組件中的數(shù)據(jù): {{msg}}</h4>
        <button @click="change">改變父組件的數(shù)據(jù)</button>
    </div>
</template>

<script>
export default {
    // 2. 在子組件內(nèi)部筋帖,使用 props 選項(xiàng)聲明獲取的數(shù)據(jù),即接收來自父組件中的數(shù)據(jù)
    props:['message'],
    data(){
        return {
            // 定義一個(gè)局部變量冤馏,并用 props 的值來初始化它
            msg:this.message
        }
    },
    methods:{
        // 定義一個(gè)方法日麸,來觸發(fā)改變父組件的數(shù)據(jù)
        change(){
            this.msg = '我改變了父組件的數(shù)據(jù)'
        }
    }
}
</script>

效果圖:


子組件改變父組件的數(shù)據(jù)
2. 定義一個(gè)計(jì)算屬性,處理 prop 的值并返回:

在 Hello.vue 中改動(dòng)

<script>
export default {
    // 2. 在子組件內(nèi)部宿接,使用 props 選項(xiàng)聲明獲取的數(shù)據(jù)赘淮,即接收來自父組件中的數(shù)據(jù)
    props:['message'],
    data(){
        return {
            // 定義一個(gè)局部變量,并用 props 的值來初始化它
            msg:this.message
        }
    },
    computed:{
        // 定義一個(gè)方法睦霎,來觸發(fā)改變父組件的數(shù)據(jù)
        change(){
            return this.msg = '我改變了父組件的數(shù)據(jù)'
        }
    }
}
</script>

當(dāng)頁(yè)面渲染成功自動(dòng)完成計(jì)算


二、子組件中改變傳過來的數(shù)據(jù)并同步到父組件
1. 使用 sync 修飾符走诞,它會(huì)被擴(kuò)展為一個(gè)自動(dòng)更新父組件屬性的 v-on 監(jiān)聽器

在 App.vue 中把 template 的內(nèi)容更改為

<template>
    <div class="hello">
        <h3>我是 App 父組件</h3>
        <h4>訪問自己的數(shù)據(jù):{{msg}}</h4>
        <hr>
        <!-- 1. 在調(diào)用子組件時(shí)副女,綁定想要獲取的父組件中的數(shù)據(jù) -->
        <!-- .sync 會(huì)被擴(kuò)展為一個(gè)自動(dòng)更新父組件屬性的 v-on 監(jiān)聽器 -->
        <Hello :message.sync="msg"></Hello>
    </div>
</template>

在 Hello.vue 中更改為

<template>
    <div class="hello">
        <h3>我是 hello 子組件</h3>
        <!-- 在頁(yè)面中直接渲染即可 -->
        <h4>訪問父組件中的數(shù)據(jù): {{message}}</h4>
        <button @click="change">改變父組件的數(shù)據(jù)</button>
    </div>
</template>

<script>
export default {
    // 2. 在子組件內(nèi)部,使用 props 選項(xiàng)聲明獲取的數(shù)據(jù)蚣旱,即接收來自父組件中的數(shù)據(jù)
    props:['message'],
    methods:{
        change(){
            // 使用 .sync 時(shí)碑幅,需要顯式的觸發(fā)一個(gè)更新事件
            // update 為固定寫法戴陡,后面跟將要被改變的數(shù)據(jù)對(duì)象,接著寫替換的數(shù)據(jù)
            this.$emit('update:message','我改變了父組件的數(shù)據(jù)')
        }
    }
}
</script>

效果為:


2. 可以將父組件中的數(shù)據(jù)包裝成對(duì)象或數(shù)組沟涨,然后在子組件中修改對(duì)象的屬性

在 App.vue 中

<template>
    <div class="hello">
        <h3>我是 App 父組件</h3>
        <h4>訪問自己的數(shù)據(jù):{{user.userName}}</h4>
        <hr>
        <!-- 2. 在調(diào)用子組件時(shí)恤批,綁定想要獲取的父組件中的數(shù)據(jù) -->
        <Hello :user="user"></Hello>
    </div>
</template>

<script>
// 引入 Hello 組件
import Hello from './assets/components/Hello.vue'
export default {
  data(){
    return {
      // 1. 在父組件中把數(shù)據(jù)寫成對(duì)象的形式
      user:{
        id:1234,
        userName:'Jack'
      }
    }
  },
  // 注冊(cè) Hello 組件
  components:{
    Hello
  }
}
</script>

在 Hello.vue 中

<template>
    <div class="hello">
        <h3>我是 hello 子組件</h3>
        <!-- 5. 在頁(yè)面中直接渲染即可 -->
        <h4>訪問父組件中的數(shù)據(jù): {{user.userName}}</h4>
        <button @click="change">改變父組件的數(shù)據(jù)</button>
    </div>
</template>

<script>
export default {
    // 3. 在子組件內(nèi)部,使用 props 選項(xiàng)聲明獲取的數(shù)據(jù)裹赴,即接收來自父組件中的數(shù)據(jù)
    props:['message','user'],
    methods:{
        // 4.直接修改 user 對(duì)象中的數(shù)據(jù)
        change(){
            this.user.userName = 'Tom'
        }
    }
}
</script>

效果如下:


我們是不允許直接修改父組件傳過來的數(shù)據(jù)或?qū)ο蟮南才樱@種方法更改的是對(duì)象中的屬性,因?yàn)閷?duì)象是引用類型棋返,指向同一內(nèi)存空間延都,所以可以實(shí)現(xiàn)此效果。推薦使用該方式

下一篇:非父子組件間通信

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末睛竣,一起剝皮案震驚了整個(gè)濱河市晰房,隨后出現(xiàn)的幾起案子筹我,更是在濱河造成了極大的恐慌冈涧,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕊退,死亡現(xiàn)場(chǎng)離奇詭異验夯,居然都是意外死亡猖吴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門簿姨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來距误,“玉大人,你說我怎么就攤上這事扁位∽继叮” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵域仇,是天一觀的道長(zhǎng)刑然。 經(jīng)常有香客問我,道長(zhǎng)暇务,這世上最難降的妖魔是什么泼掠? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮垦细,結(jié)果婚禮上择镇,老公的妹妹穿的比我還像新娘。我一直安慰自己括改,他們只是感情好腻豌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般吝梅。 火紅的嫁衣襯著肌膚如雪虱疏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天苏携,我揣著相機(jī)與錄音做瞪,去河邊找鬼。 笑死右冻,一個(gè)胖子當(dāng)著我的面吹牛装蓬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播国旷,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼矛物,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了跪但?” 一聲冷哼從身側(cè)響起履羞,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎屡久,沒想到半個(gè)月后忆首,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡被环,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年糙及,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筛欢。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浸锨,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出版姑,到底是詐尸還是另有隱情柱搜,我是刑警寧澤,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布剥险,位于F島的核電站聪蘸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏表制。R本人自食惡果不足惜健爬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望么介。 院中可真熱鬧娜遵,春花似錦、人聲如沸壤短。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)鸽扁。三九已至蒜绽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桶现,已是汗流浹背躲雅。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留骡和,地道東北人相赁。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像慰于,于是被迫代替她去往敵國(guó)和親钮科。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容