VUE組件間傳值詳解

單向傳值方式:

props:

所有的 prop 都使得其父子 prop 之間形成了一個單向下行綁定:父級 prop 的更新會向下流動到子組件中,但是反過來則不行。這樣會防止從子組件意外改變父級組件的狀態,從而導致你的應用的數據流向難以理解。

額外的,每次父級組件發生更新時,子組件中所有的 prop 都將會刷新爲最新的值。這意味着你應該在一個子組件內部改變 prop。如果你這樣做了,Vue 會在瀏覽器的控制檯中發出警告。

注意在 JavaScript 中對象和數組是通過引用傳入的,所以對於一個數組或對象類型的 prop 來說,在子組件中改變這個對象或數組本身將會影響到父組件的狀態。

 

type 可以是下列原生構造函數中的一個:

事件名:

  <default-component @defaultEvent = "a" />

組件default-component 可以通過 this.$emit("defaultEvent",obj) 來給父組件傳值。

  • String
  • Number
  • Boolean
  • Array
  • Object
  • Date
  • Function
  • Symbol

雙向綁定傳值方式:

2.2.0+ 新增 v-model

一個組件上的 v-model 默認會利用名爲 value 的 prop 和名爲 input 的事件,但是像單選框、複選框等類型的輸入控件可能會將 value 特性用於不同的目的model 選項可以用來避免這樣的衝突:

Vue.component('base-checkbox', {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: {
    checked: Boolean
  },
  template: `
    <input
      type="checkbox"
      v-bind:checked="checked"
      v-on:change="$emit('change', $event.target.checked)"
    >
  `
})

現在在這個組件上使用 v-model 的時候:

<base-checkbox v-model="lovingVue"></base-checkbox>

這裏的 lovingVue 的值將會傳入這個名爲 checked 的 prop。同時當 <base-checkbox> 觸發一個 change 事件並附帶一個新的值的時候,這個 lovingVue 的屬性將會被更新。

注意你仍然需要在組件的 props 選項裏聲明 checked 這個 prop。

2.3.0+ 新增 .sync 修飾符

在有些情況下,我們可能需要對一個 prop 進行“雙向綁定”。不幸的是,真正的雙向綁定會帶來維護上的問題,因爲子組件可以修改父組件,且在父組件和子組件都沒有明顯的改動來源。

這也是爲什麼我們推薦以 update:myPropName 的模式觸發事件取而代之。舉個例子,在一個包含 title prop 的假設的組件中,我們可以用以下方法表達對其賦新值的意圖:

this.$emit('update:title', newTitle)

然後父組件可以監聽那個事件並根據需要更新一個本地的數據屬性。例如:

<text-document
  v-bind:title="doc.title"
  v-on:update:title="doc.title = $event"
></text-document>

爲了方便起見,我們爲這種模式提供一個縮寫,即 .sync 修飾符:

<text-document v-bind:title.sync="doc.title"></text-document>

注意帶有 .sync 修飾符的 v-bind 不能和表達式一起使用 (例如 v-bind:title.sync=”doc.title + ‘!’” 是無效的)。取而代之的是,你只能提供你想要綁定的屬性名,類似 v-model

當我們用一個對象同時設置多個 prop 的時候,也可以將這個 .sync 修飾符和 v-bind 配合使用:

<text-document v-bind.sync="doc"></text-document>

這樣會把 doc 對象中的每一個屬性 (如 title) 都作爲一個獨立的 prop 傳進去,然後各自添加用於更新的 v-on 監聽器。

將 v-bind.sync 用在一個字面量的對象上,例如 v-bind.sync=”{ title: doc.title }”,是無法正常工作的,因爲在解析一個像這樣的複雜表達式的時候,有很多邊緣情況需要考慮。

 

當然,上面說到了props傳值中 有一種傳引用,props傳值類型是數值或者對象時,可以在子組件裏面改變props中對象的值,父組件也會改變,但是這樣有一定風險。 

父鏈與子組件索引

這中方式來相互調用組件間的數據,這種方式不推薦

vuex

用狀態管理進行組件件數據通信

中央事件總線bus

在Vue . 2.x 中, 推薦使用一個空的Vue 實例作爲中央事件總線(bus),組件A傳值組件B,這時候需要bus總線的中間件,組件A bus.$emit("bfun","aa"),這樣發送數據aa,組件B 需要通過 bus.$on("bfun", function(message){console.log(message)});

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