Vue 學習筆記: 組件通信方式彙總

背景

Vue.js 在前端貌似很火的樣子,雖然年初玩過 Angular.js ,同爲前端框架,使用體驗很類似,但是 Angular.js 的知識已經淡忘了。

十一月份敲過一天 Vue 的 demo ,加入它跟 Java 的 OOP 很相似,分爲屬性和方法,通過行爲改變屬性。直接以面向對象的方式訪問數據就可以了,不需要用 jQuery 操作 DOM 樹,使用相對簡單。所以根據短期之內,Vue 忘記的可能性不大。

本文就來整理一下組件通信的幾種方式,尤其是涉計到彈框組件的通信過程。

常見的通信場景

element 提供了 el-dialog 組件,它的本質是通過 v-show 屬性控制一個彈框組件的顯示和隱藏的。傳統的開發過程中,比較常見的一種場景是:

第一步,彈出一個新的配置頁面
第二步,在配置頁面上輸入表單數據
第三步,點擊 “確定” 按鈕,將用戶在彈出頁面的配置信息回顯到主頁面上

比如,添加收貨地址的彈出框:
在這裏插入圖片描述
點擊 “確定” 後,需要將彈框頁面上的數據回顯在父頁面上。

此外,非彈框子組件和父組件雙向通信的場景:

1、子組件需要父組件傳遞初始化數據,比如,彈出編輯頁面;
2、父組件需要收集子組件修改後的數據,比如,編輯保存操作。

propsemit

propsemit 基本上能夠滿足非彈框子組件和父組件雙向通信的場景。

但是 props 的侷限在於它是父子組件傳遞數據的方式,是由父組件單向控制子組件屬性的,所以不能在子組件中直接修改自己的 props 屬性,否則 vue 會報錯【示例錯誤信息】:

[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: "coo1"

emit 需要父組件提供監聽事件,才能觸發。
中和二者,得到的使用經驗是:

第一,子組件只需要父組件傳遞初始數據,然後自己維護 props 數據時,最好使用 props 接收初始值,然後再在 data 函數中以 props 數據爲複本來初始化自己的真實數據。

   props: ['myMessage'],
    data () {
      return {
        message: myMessage // 以父組件傳入的屬性的複本作爲初始值
      }
    }

第二,父組件如果需要使用子組件的數據,可以直接在自己的方法中使用 $refs 訪問子組件的數據。

最簡單的 $refs

父組件引用子組件時,指定它的 ref 屬性標識子組件的引用名詞,然後就能直接通過自己的 $refs 屬性訪問到子組件,使用子組件的數據了。

介紹一個簡單的實例,一個計數子組件的數據要能被父組件直接使用,父組件定義:

<template>
  <div class="app-container">
    <counter v-show="false" ref="counter"></counter>
    <button @click="onShow">提交</button>
    <p>counter 當前的計數值爲 {{myCount}}</p>
 </div>
</template>

//按鈕事件中,直接訪問子組件的數據值
onShow(){
      let counter = this.$refs.counter
      console.log('$ref is'+counter)
      this.myCount = counter.count;
    }

計數子組件定義:

<template>
  <button v-on:click="count++">點擊計算點擊次數:{{count}}次</button>
</template>
<script>
export default {
  data() {
    return {
      count: 10,
    }
  },
}
</script>

啓示錄

就組件通信的各種方式來看,事件觸發是比較繁瑣一點的。$refsprops 兩種通信方式學會之後,對解決前面幾類通信場景來說,就夠用了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章