成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Vue3 $emit指南--包含選項API、組合API以及 setup 語法糖

開發 前端
在 vue3 中,與組件和 prop 一樣,事件名提供了自動的大小寫轉換。如果在子組件中觸發一個以 camelCase (駝峰式命名) 命名的事件,你將可以在父組件中添加一個 kebab-case (短橫線分隔命名) 的監聽器。

許多Vue模式涉及使用props將數據從父組件傳遞到子組件。但如果我們需要一個子組件將數據傳給它的父組件呢?

使用 emit,我們可以觸發事件并將數據傳遞到組件的層次結構中。這對下面幾種情況很有用,如:

  • 從 input 中發出數據
  • 從 modal 本身內部關閉 modal
  • 父組件響應子組件

Vue Emit是如何工作的?

當我們 emit 一個事件時,我們用一個或多個參數調用一個方法:

  • eventName: string - 事件的名稱
  • values: any - 通過事件傳遞的參數

下面是一個內聯 emit的例子,<button @click="$emit('add', Math.random())">?。emit一個名為add?的事件,并將Math.random()的值作為參數傳遞出去。

然后,在父組件使用v-on或@指令可以監聽我們的自定義添加事件并接收該參數值。

Child.vue

<template>
<button @click="$emit('add', Math.random())">
Add Math.random()
</button>
</template>

在** Parent.vue **中監聽:

<script setup>
import { ref } from 'vue'
const count = ref(0)
// 也可以從我們的模板中調用一個函數 `<ChildComponent @add="add" />
// const add = (i) => count.value += i
</script>
<template>
<ChildComponent @add="(i) => count += i" />
<p>Count: {{ count }}</p>
</template>

圖片

每次我們點擊按鈕,Child.vue? 都會 emit 一個 add? 事件,并帶有一個0到1之間的隨機值。然后,Parent.vue 捕捉到這個事件,并將這個值添加到計數中。

可以傳遞任意多的參數,監聽器也會收到所有的參數:

  • Child - $emit('add', Math.random(), 44, 50)
  • Parent -@add="(i, j, k) => count += i + j + k"

現在,我們知道如何在我們的模板中 emit 內聯事件,但在更復雜的例子中,如果我們從SFC的script 中 emit 一個事件會更好。特別是當我們想在 emit 事件之前執行一些邏輯時,這很有用。

在Vue 3中,我們有2種不同的方法來做到這一點:

  • 選項API - this.$emit
  • 帶有setup()?的組合API - context.emit
  • 帶有<script setup>?的組合API -defineEmits()

我們一個一個來看。

選項API - this.$emit

在 Vue3 中,我人可以選擇使用選項API或組合API。

在選項API中,我們可以調用this.$emit來 emit一個自定義事件。

看下面這個例子在 MyTextInput.vue? 中,它包含一個 label? 和 input?。每當 input 改變時,我們會 emit 一個事件,并將輸入的值轉成大寫作為參數傳遞出去。

我們可以不從模板中調用$emit?,而是調用一個組件方法。在該方法中調用this.$emit并把我們的值傳給它。

MyTextInput.vue

<script>
export default {
methods: {
handleChange (event) {
this.$emit("customChange", event.target.value.toUpperCase())
}
}
}
</script>

<template>
<div>
<label>My Custom Input</label>
<input type="text" placeholder="Custom input!" @input="handleChange" />
</div>
</template>

在 Parent.vue 中接收:

<script>
export default {
methods: {
handleChange (event) {
this.$emit("customChange", event.target.value.toUpperCase())
}
}
}
</script>

<template>
<div>
<label>My Custom Input</label>
<input type="text" placeholder="Custom input!" @input="handleChange" />
</div>
</template>

帶有setup()?的組合API - context.emit

在 組合API中,如果使用setup?函數,就不能在用 this?,也就是不能調用this.$emit()方法了。

相反,可以使用 setup 方法中的第二個參數 context? 來訪問 emit?  方法。我們可以用之前使用的事件名稱和值調用context.emit。

MyTextInput.vue

<script>
export default {
// can use the entire context object
setup (props, context) {
const handleChange = (event) => {
context.emit("customChange", event.target.value)
}
return {
handleChange
}
},
// or we can destructure it and get `emit`
setup (props, { emit }) {
const handleChange = (event) => {
emit("customChange", event.target.value)
}
return {
handleChange
}
}
}
</script>

<template>
<div>
<label>My Custom Input</label>
<input type="text" placeholder="Custom input!" @input="handleChange" />
</div>
</template>

圖片

在 <script setup> 中的用法

當我們使用<script setup>?時,我們無法訪問組件實例或 context? 上下文參數。那我們怎么獲得 emit ?

在這種情況下,我們可以使用 defineEmits:

  • 指定組件要 emit 事件
  • 為每個事件添加驗證信息
  • 可以訪問與context.emit相同的值

在最簡單的情況下,defineEmits是一個字符串數組,每個字符串是一個事件的名稱。

MyTextInput.vue

<script setup>
const emit = defineEmits(['customChange'])

const handleChange = (event) => {
emit('customChange', event.target.value.toUpperCase())
}
</script>

圖片

然而,如果我們傳遞一個對象,我們可以為每個事件添加一個驗證器函數,我們可以在里面檢查值是否是我們所需要的格式。

像事件監聽器一樣,驗證器接受我們傳入所有參數。

這與prop  validation 類似,如果我們的驗證器返回 false,會在控制臺得到一個警告,這為我們提供了一些有用的信息。

MyTextInput.vue

<script setup>
const emit = defineEmits({
unvalidatedEvent: null, // if we want an event without validation
customChange: (s) => {
if (s && typeof s === 'string') {
return true
} else {
console.warn(`Invalid submit event payload!`)
return false
}
},
})

const handleChange = (event) => {
// no console warning
emit('customChange', event.target.value.toUpperCase())
}

onMounted(() => {
emit('customChange', 1) // not a string, warning!
})
</script>

最佳實踐

使用 emits 定義自定義事件

如果我們不使用defineEmits?,我們仍然可以通過export default?中定義emits選項來跟蹤一個組件的自定義事件。

這對保持良好的組件文檔很重要,如果我們試圖使用一個沒有在 emits 中聲明的事件,也會從Vue那里得到錯誤。

當在 emits 選項中定義了原生事件 (如 change) 時,將使用組件中的事件替代原生事件偵聽器。

<script>
export default {
emits: ["change"] // or can pass object with validators
}
</script>
<template>
<div>
<label>My Custom Input</label>
<input
type="text"
placeholder="Custom input!"
@input='$emit("change", $event.target.value)'
/>
</div>
</template>

正確的事件命令

在 vue3 中,與組件和 prop 一樣,事件名提供了自動的大小寫轉換。如果在子組件中觸發一個以 camelCase (駝峰式命名) 命名的事件,你將可以在父組件中添加一個 kebab-case (短橫線分隔命名) 的監聽器。

然而,如果你使用的是Vue 2,事件名稱沒有自動的大小寫轉換,由于v-on指令會自動將你的事件名稱轉換為小寫,所以camelCase命名的事件不可能被監聽到。

例如,如果我們發出了一個名為myEvent?的事件,監聽my-event將無法工作。

作者:Noveo 譯者:小智  來源:learnvue 原文:https://learnvue.co/tutorals/vue-emit-guide?

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2023-04-27 11:07:24

Setup語法糖Vue3

2020-09-19 21:15:26

Composition

2021-12-15 08:23:42

Vue3 插件Vue應用

2022-06-13 08:39:21

Vue3API

2022-06-21 12:09:18

Vue差異

2024-03-15 08:45:31

Vue 3setup語法

2021-12-01 08:11:44

Vue3 插件Vue應用

2022-08-04 14:38:49

vue3.2setup代碼

2021-12-16 08:27:54

Vue3 插件Vue應用

2020-10-20 09:51:51

Vue 3 的組合

2020-10-20 09:30:13

Vue 3 API 數據

2024-10-14 09:34:39

vue3通信emit

2021-12-02 05:50:35

Vue3 插件Vue應用

2024-03-01 11:32:22

Vue3APIVue.js

2025-03-26 10:29:22

Vue3前端API

2021-07-29 12:05:18

Vue3Api前端

2022-03-24 15:28:43

Vue開發框架

2024-06-25 12:20:31

2011-04-13 13:38:57

選項APIBlackBerry

2021-03-30 08:05:39

Vue 3 生命周期Vue2
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品视频999 | 天天拍天天插 | 亚洲一级毛片 | 国产精品中文字幕在线 | 国产农村一级国产农村 | 亚洲综合色视频在线观看 | 国产免费一区二区三区 | 亚洲 欧美 日韩 在线 | 四虎影院免费在线播放 | 国产精品成人国产乱一区 | 人人玩人人添人人澡欧美 | 欧美一区中文字幕 | 鸡毛片| 福利视频亚洲 | 国产精品免费高清 | 亚洲网站在线观看 | 黄色在线免费观看视频 | 国产91久久久久蜜臀青青天草二 | 成人小视频在线观看 | a欧美 | 男女视频在线免费观看 | 产真a观专区 | 天堂色综合| 综合精品在线 | 日韩av最新网址 | 日本欧美大片 | 国产jizz女人多喷水99 | 国产精品一区三区 | 日韩久久精品 | 在线观看成人av | 最新国产在线 | 日本欧美在线 | 国内自拍偷拍一区 | 天天躁日日躁狠狠很躁 | 亚洲精品一区国语对白 | 国产美女一区二区 | 二区三区视频 | 中文字幕在线观看一区 | 久久综合99 | 国产精品国产三级国产aⅴ原创 | 亚洲a一区|