avatar

目錄
Vue 子組件更新父組件資料的『五種』方式(Part 2)

Hi,大家好,我是小馬彬,延續上一篇紀錄 Vue 的 Component 在 props 到子組件時,如何有效的更新 props 回到父組件,如果還沒看過基本的兩種父子組件溝通的方式,可以先看看上一篇『Vue 子組件更新父組件資料的『五種』方式(Part 1)』,這篇要來繼續把剩下的三種方式補完,其實可以都算是從基礎的方式衍生下來的,包括下一篇可能會介紹到的 provide / inject,都可以用類似的概念去理解,好,就來開始介紹組件溝通的不同方式吧!

3. 父組件在使用子組件時寫上 .sync

.sync 是在 Vue 2.3.0+ 時新增的,筆者認為主要是想要讓子組件在更新父組件時,能夠用一個好閱讀並理解的更新 props 的事件,假使我用 將值用這種方式傳遞給 Child,那我就可以直接在 Child 組件裡面直接使用 this.$emit('update:title', newTitle) 這種方式來改變父組件資料,這樣就能一眼看出 $emit 是更新了哪一個 props,這是 Vue 後來推出的方式

子組件 InputThree.vue

父組件 Home.vue

在父組件直接使用 :innputValue.sync="inputValue",子組件就會有對應的事件 update:inputValue

.sync 語法糖轉換後的寫法是這樣

demo

4. 父組件使用 v-model,子組件使用 $emit

這裡要展示 的使用方式,首先要先知道 v-model 這個語法糖的意義

v-model="inputValue"

v-model 會轉成 :value 及 @input 互相搭配,如下

:value="inputValue" @input="inputValue = $event"

通常是給 input 使用,所以使用在父子組件溝通上,筆者覺得算是特殊的用法

子組件 InputFive.vue

父組件 Home.vue

v-model 語法糖轉換後的寫法是這樣

demo

5. 父組件使用 v-model,子組件用 computed + v-model

這又是更變形的做法,利用 computed 的 get、set 將改動值時的結果傳回父組件

子組件 InputSeven.vue

父組件 Home.vue

demo


以上的父子組件溝通都是在傳遞 String,如果是在傳遞 Array 或是 Object 時,就得更加小心,因為傳址及傳值的差異,一不小心可能會造成無法預期的結果出現,這五種,我想我最推薦的應該會是第三種 .sync 的方式,語意上比較明瞭

之後應該還會講到 provide / inject,讓父子組件的溝通在跨更多層的情形,能更方便的傳遞要使用的數據

文章作者: 小馬彬
文章鏈接: https://littlehorseboy.github.io/2020/02/08/2020-vue-component-v-model-part2/
版權聲明: 本博客所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 小馬彬的部落格

評論