因為造輪子要進行元件傳值選型,臨時來單總結一下
元件間傳值
-
- 父向子: props、dispatch
-
- 子向父:emit、on
-
- 雙向v-model、.sync
-
- 父向子向孫子:broadcast 廣播事件, 向下傳遞給所有的後代; provide、inject其是祖父元件--孫元件等有跨度的元件間傳值,單向傳值(由provide的元件傳遞給inject的元件),類似廣播事件。
-
- 子向父向爺爺:dispatch 派發事件,沿著父鏈冒泡;其他情況下孫子是沒法跨過父親向爺爺直接傳值的,必須經過父親傳遞一次。
-
- 任意間傳值:eventbus、global,vuex
sync 在1.0被新增,單sync破壞了單向資料流,在2.0被移除了,但是在實際應用中,我們發現 .sync 還是有其適用之處的,比如在開發可複用的元件庫時。於是從 vue 2.3.0 開始,我們重新引入了 .sync 修飾符,但是這次它只是作為一個編譯時的語法糖存在。他會被自動擴充套件為一個自動更新父元件屬性的 v-on 監聽器。
dispatch已經被移除了,這種實現思路被element ui傳承了下來,改良後還是很有價值的。這其中明確用來傳值的機制要留給傳值使用,不適合做狀態傳遞。
子向父向爺爺傳值
業務元件通常是組合基礎元件來實現的,基礎元件已經有v-model,業務元件可以這樣新增v-model屬性,這樣就可以實現向上層層傳值。
/// 基礎元件 fd-select 已經實現了 v-model,原理是一樣的
...
<template>
<section class="income-info">
<h1>收入資訊</h1>
<fd-select filed-name="稅後月收入範圍"
:list="incomeList"
v-model="value">
</fd-select>
</section>
</template>
import {Vue, Model, Watch} from 'vue-property-decorator';
export default class IncomeInfo extends Vue {
// 這段程式碼可以給元件新增 v-model 屬性
@Model('change', { type: String }) value!: string
@Watch('value',{deep: true})
change(newVal) {
this.$emit('change', newVal);
}
}
...
<income-info v-model="income"> </income-info>
// 這樣就可以一直巢狀下去了
複製程式碼