我們知道,子元件通過 prop 來接收父元件傳遞的資料。但子元件怎麼跟父元件通訊呢?這個時候 vue 的自定義事件系統就派得上用場了。
每個 vue 例項都實現了事件介面,即:
vue 的事件系統與瀏覽器的 eventtarget api 有所不同。儘管它們執行起來類似,但是 $on 和 $emit 並不是addeventlistener 和 dispatchevent 的別名。
另外,父元件可以在使用子元件的地方直接用 v-on 來監聽子元件觸發的事件。
不能用 $on 監聽子元件釋放的事件,而必須在模板裡直接用 v-on 繫結,參見下面的例子。
}
vue.component('button-counter', }',
data: function ()
},methods:
},})new vue(,
methods:
}})
在本例中,子元件已經和它外部完全解耦了。它所做的只是報告自己的內部事件,因為父元件可能會關心這些事件。請注意這一點很重要。
這裡有乙個如何使用載荷 (payload) 資料的示例:
}
vue.component('button-message',
},methods: )
}}})
new vue(,
methods:
}})
第二個示例的重點在於子元件仍然是完全和外界解耦的。
你可能想在某個元件的根元素上監聽乙個原生事件。可以使用 修飾符 .native。
在一些情況下,我們可能會需要對乙個 prop 進行「雙向繫結」。事實上,這正是 vue 1.x 中的 .sync 修飾符所提供的功能。當乙個子元件改變了乙個帶 .sync 的 prop 的值時,這個變化也會同步到父元件中所繫結的值。這很方便,但也會導致問題,因為它破壞了單向資料流。由於子元件改變 prop 的**和普通的狀態改動**毫無區別,當光看子元件的**時,你完全不知道它何時悄悄地改變了父元件的狀態。這在 debug 複雜結構的應用時會帶來很高的維護成本。
這正是我們在 2.0 中移除 .sync 的理由。但是在 2.0 發布之後的實際應用中,我們發現 .sync 還是有其適用之處,比如在開發可復用的元件庫時。我們需要做的只是讓子元件改變父元件狀態的**更容易被區分。
從 2.3.0 起我們重新引入了 .sync 修飾符,但是這次它只是作為乙個編譯時的語法糖存在。它會被擴充套件為乙個自動更新父元件屬性的 v-on ***。
如下**
會被擴充套件為:
bar = val">
當子元件需要更新 foo 的值時,它需要顯式地觸發乙個更新事件:
this.$emit('update:foo', newvalue)
當使用乙個物件一次性設定多個屬性的時候,這個 .sync 修飾符也可以和 v-bind 一起使用:
這個例子會為 foo 和 bar 同時新增用於更新的 v-on ***。
自定義事件可以用來建立自定義的表單輸入元件,使用 v-model 來進行資料雙向繫結。
必須牢記:
是以下示例的語法糖:
所以,在元件中使用時,它相當於下面的簡寫:
所以要讓元件的 v-model 生效,它應該:
來看乙個非常簡單的貨幣輸入的自定義控制項:
vue.component('currency-input',
// 通過 input 事件帶出數值
this.$emit('input', number(formattedvalue))
}}})
上面的例子還是比較初級的。比如,使用者居然可以輸入多個小數點或句號。
因此我們需要乙個複雜一些的例子,下面是乙個更加完善的貨幣過濾器:
label="price"
v-model="price"
>
total: $}
vue.component('currency-input', }\$\\
\ ',
props: ,
label:
},mounted: function () ,
methods:
this.$emit('input', result.value)
},formatvalue: function () ,
selectall: function (event) , 0)
}}})
new vue(,
computed:
}})
預設情況下,乙個元件的 v-model 會使用 value prop 和 input 事件。但是諸如單選框、核取方塊之類的輸入型別可能把 value 用作了別的目的。model 選項可以避免這樣的衝突:
vue.component('my-checkbox', ,
props: ,
// ...
})
上述**等價於:
"
value="some value">
注意: 仍然需要顯式宣告 checked 這個 prop。
有時,非父子關係的兩個元件之間也需要通訊。在簡單的場景下,可以使用乙個空的 vue 例項作為事件匯流排:
var bus = new vue()
// 觸發元件 a 中的事件
bus.$emit('id-selected', 1)
// 在元件 b 建立的鉤子中監聽事件
bus.$on('id-selected', function (id) )
在複雜的情況下,我們應該考慮使用專門的狀態管理模式。 Vue自定義事件
父元件使用props傳遞資料給子元件,子元件怎麼跟父元件通訊呢?這時,vue的自定義事件就派上用場了。本文將詳細介紹vue自定義事件 每個 vue 例項都實現了事件介面 events inte ce 即 使用 on eventname 監聽事件 使用 emit eventname 觸發事件 注意 v...
vue 自定義事件
vue中自定義的事件,不同於元件和props屬性,事件名沒有任何的大小寫轉換,觸發的事件必須完全匹配這個事件所用的名稱,所以在使用this.emit clicka data 時,clicka必須與定義的事件名一致 當引數為物件時,父元件接收時以及子元件傳參時,最好使用json.parse json....
vue自定義事件
父元件使用props傳遞資料給子元件,子元件怎麼跟父元件通訊呢?這時,vue的自定義事件就派上用場了。子元件 子元件通過 emit可以觸發事件,第乙個引數為要觸發的事件,第二個事件為要傳遞的資料 父元件 父元件可以在使用子元件的地方直接用 v on 來監聽子元件觸發的事件 它只是作為乙個編譯時的語法...