做自(zì)由與創造的先行者

組件事(shì)件

Vue.js中文(wén)手冊

此章節假設你(nǐ)已經看(kàn)過了(le)組件基礎。若你(nǐ)還不了(le)解組件是什(shén)麽,請(qǐng)先閱讀該章節。

觸發與監聽事(shì)件 ​

在組件的模闆表達式中,可以直接使用(yòng) $emit 方法觸發自(zì)定義事(shì)件 (例如:在 v-on 的處理(lǐ)函數中):

template

<!-- MyComponent -->

<button @click="$emit('someEvent')">click me</button>

$emit() 方法在組件實例上(shàng)也(yě)同樣以 this.$emit() 的形式可用(yòng):

js

export default {

methods: {

submit() {

this.$emit('someEvent')

}

}

}

父組件可以通過 v-on (縮寫爲 @) 來(lái)監聽事(shì)件:

template

<MyComponent @some-event="callback" />

同樣,組件的事(shì)件監聽器也(yě)支持 .once 修飾符:

template

<MyComponent @some-event.once="callback" />

像組件與 prop 一樣,事(shì)件的名字也(yě)提供了(le)自(zì)動的格式轉換。注意這(zhè)裏我們觸發了(le)一個以 camelCase 形式命名的事(shì)件,但(dàn)在父組件中可以使用(yòng) kebab-case 形式來(lái)監聽。與 prop 大(dà)小(xiǎo)寫格式一樣,在模闆中我們也(yě)推薦使用(yòng) kebab-case 形式來(lái)編寫監聽器。

TIP

和(hé)原生 DOM 事(shì)件不一樣,組件觸發的事(shì)件沒有冒泡機制。你(nǐ)隻能(néng)監聽直接子組件觸發的事(shì)件。平級組件或是跨越多層嵌套的組件間通信,應使用(yòng)一個外(wài)部的事(shì)件總線,或是使用(yòng)一個全局狀态管理(lǐ)方案。

事(shì)件參數 ​

有時(shí)候我們會(huì)需要在觸發事(shì)件時(shí)附帶一個特定的值。舉例來(lái)說,我們想要 <BlogPost> 組件來(lái)管理(lǐ)文(wén)本會(huì)縮放(fàng)得多大(dà)。在這(zhè)個場景下(xià),我們可以給 $emit 提供一個額外(wài)的參數:

template

<button @click="$emit('increaseBy', 1)">

Increase by 1

</button>

然後我們在父組件中監聽事(shì)件,我們可以先簡單寫一個内聯的箭頭函數作(zuò)爲監聽器,此函數會(huì)接收到(dào)事(shì)件附帶的參數:

template

<MyButton @increase-by="(n) => count += n" />

或者,也(yě)可以用(yòng)一個組件方法來(lái)作(zuò)爲事(shì)件處理(lǐ)函數:

template

<MyButton @increase-by="increaseCount" />

該方法也(yě)會(huì)接收到(dào)事(shì)件所傳遞的參數:

js

methods: {

increaseCount(n) {

this.count += n

}

}

TIP

所有傳入 $emit() 的額外(wài)參數都會(huì)被直接傳向監聽器。舉例來(lái)說,$emit('foo', 1, 2, 3) 觸發後,監聽器函數将會(huì)收到(dào)這(zhè)三個參數值。

聲明(míng)觸發的事(shì)件 ​

組件可以顯式地通過 emits 選項來(lái)聲明(míng)它要觸發的事(shì)件:

js

export default {

emits: ['inFocus', 'submit']

}

這(zhè)個 emits 選項還支持對(duì)象語法,它允許我們對(duì)觸發事(shì)件的參數進行驗證:

js

export default {

emits: {

submit(payload) {

// 通過返回值爲 `true` 還是爲 `false` 來(lái)判斷

// 驗證是否通過

}

}

}

TypeScript 用(yòng)戶請(qǐng)參考:如何爲組件所抛出的事(shì)件标注類型。

盡管事(shì)件聲明(míng)是可選的,我們還是推薦你(nǐ)完整地聲明(míng)所有要觸發的事(shì)件,以此在代碼中作(zuò)爲文(wén)檔記錄組件的用(yòng)法。同時(shí),事(shì)件聲明(míng)能(néng)讓 Vue 更好(hǎo)地将事(shì)件和(hé)透傳 attribute 作(zuò)出區(qū)分,從(cóng)而避免一些(xiē)由第三方代碼觸發的自(zì)定義 DOM 事(shì)件所導緻的邊界情況。

TIP

如果一個原生事(shì)件的名字 (例如 click) 被定義在 emits 選項中,則監聽器隻會(huì)監聽組件觸發的 click 事(shì)件而不會(huì)再響應原生的 click 事(shì)件。

事(shì)件校驗 ​

和(hé)對(duì) props 添加類型校驗的方式類似,所有觸發的事(shì)件也(yě)可以使用(yòng)對(duì)象形式來(lái)描述。

要爲事(shì)件添加校驗,那麽事(shì)件可以被賦值爲一個函數,接受的參數就是抛出事(shì)件時(shí)傳入 this.$emit 的内容,返回一個布爾值來(lái)表明(míng)事(shì)件是否合法。

js

export default {

emits: {

// 沒有校驗

click: null,

// 校驗 submit 事(shì)件

submit: ({ email, password }) => {

if (email && password) {

return true

} else {

console.warn('Invalid submit event payload!')

return false

}

}

},

methods: {

submitForm(email, password) {

this.$emit('submit', { email, password })

}

}

}

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:組件 v-model
上(shàng)一篇:Props