1. 程式人生 > 其它 >switchpreference 事件_Vue 3 自定義事件

switchpreference 事件_Vue 3 自定義事件

技術標籤:switchpreference 事件template js 定義變數vue @click 多個事件vue click事件傳引數vue3.x components 如何定義

自定義事件

除了系統自帶的原生 DOM 自帶的事件之外,有時候我們需要用到這些自帶的事件之外,我們就必須要自定義事件了。

事件名

不同於元件和 prop,事件名不存在任何自動化的大小寫轉換。而是觸發的事件名需要完全匹配監聽這個事件所用的名稱。舉個例子,如果觸發一個 camelCase 名字的事件,我們還是接著昨天的專案繼續往下寫,在 TestCom.vue 使用 button 按鈕點選事件分發一個 click-event

事件,不同於元件和 prop,事件名不會被用作一個 JavaScript 變數名或 property 名,所以就沒有理由使用 camelCase 或 PascalCase 了。並且 v-on 事件監聽器在 DOM 模板中會被自動轉換為全小寫 (因為 HTML 是大小寫不敏感的),所以 @myEvent 將會變成 @myevent——導致 myEvent 不可能被監聽到。

<template>
<divclass="test-com-wrap">
{{title}}
<button@click="click">按鈕button>
div>
template>
<script>exportdefault{name:"TestCom",props:{title:{type:String,default:"",
},
},
created(){console.log(this.$attrs)
},methods:{
click(e){this.$emit('click-event',e)
}
}
};script>

然後我們在 TemplateM.vue 來接收這個事件:

<template>
<divclass="template-m-wrap">
<test-comtitle="這個是元件"data-status="active"
@click-event="clickEvent"
>test-com>
div>
template>
<script>importTestComfrom"./TestCom";exportdefault{name:"TemplateM",components:{
TestCom,
},
data(){return{};
},methods:{
clickEvent(e){console.log("e===>",e.target)
}
},
};script>

檢視瀏覽效果:

b486a370-f217-eb11-8da9-e4434bdf6706.png

定義自定義事件

繼續上面的程式碼,可以通過 emits 選項在元件上定義已經發出的事件:

<template>
<divclass="test-com-wrap">
{{title}}
<button@click="click">按鈕button>
div>
template>
<script>exportdefault{name:"TestCom",props:{title:{type:String,default:"",
},
},emits:['click-event'],
created(){console.log(this.$attrs)
},methods:{
click(e){this.$emit('click-event',e)
}
}
};script>

驗證丟擲的事件

與 prop 型別驗證類似,如果使用物件語法而不是陣列語法定義發出的事件,則可以驗證它。

要新增驗證,將為事件分配一個函式,該函式接收傳遞給 $emit 呼叫的引數,並返回一個布林值以指示事件是否有效,在 main.js 寫下如下程式碼:

import{createApp}from'vue/dist/vue.esm-bundler.js'
importAppfrom'./App.vue'
importrouterfrom'./router'
importstorefrom'./store'
letapp=createApp(App)
app.use(store).use(router).mount('#app')
app.component('custom-form',{
template:`
提交 `,
data(){
return{
email:'',
password:''
}
},
emits:{
//沒有驗證
click:null,

//驗證submit事件
submit:({email,password})=>{
if(email&&password){
returntrue
}else{
console.warn('Invalidsubmiteventpayload!')
returnfalse
}
}
},
methods:{
submitForm(){
this.$emit('submit',{email:this.email,password:this.password})
}
}
})

TemplateM.vue 寫下程式碼:

<template>
<divclass="template-m-wrap">
<custom-form@submit="submit">custom-form>
div>
template>
<script>exportdefault{name:"TemplateM",components:{
},
data(){return{};
},methods:{
submit(options){console.log(options)
}
},
};script>

我們檢視效果如下:

b586a370-f217-eb11-8da9-e4434bdf6706.png

v-model 引數

在本例中,子元件將需要一個 foo prop 併發出 update:foo 要同步的事件,還是在 main.js

import{createApp}from'vue/dist/vue.esm-bundler.js'
importAppfrom'./App.vue'
importrouterfrom'./router'
importstorefrom'./store'
letapp=createApp(App)
app.use(store).use(router).mount('#app')
app.component('my-component',{
props:{
foo:String
},
template:`type="text"
:value="foo"
@input="$emit('update:foo',$event.target.value)">
`
})

預設情況下,元件上的 v-model 使用 modelValue 作為 prop 和 update:modelValue 作為事件。我們可以通過向 v-model 傳遞引數來修改這些名稱:

<template>
<divclass="template-m-wrap">
<my-componentv-model:foo="bar">my-component>
div>
template>
<script>exportdefault{name:"TemplateM",components:{
},
data(){return{bar:'dsdsdd'
};
},methods:{
submit(options){console.log(options)
}
},
};script>

檢視效果如下:

ba86a370-f217-eb11-8da9-e4434bdf6706.png

多個 v-model 繫結

通過利用以特定 prop 和事件為目標的能力,正如我們之前在 v-model 引數中所學的那樣,我們現在可以在單個元件例項上建立多個 v-model 繫結。

每個 v-model 將同步到不同的 prop,而不需要在元件中新增額外的選項:

import{createApp}from'vue/dist/vue.esm-bundler.js'
importAppfrom'./App.vue'
importrouterfrom'./router'
importstorefrom'./store'
letapp=createApp(App)
app.use(store).use(router).mount('#app')
app.component('user-name',{
props:{
firstName:String,
lastName:String
},
template:`type="text"
:value="firstName"
@input="$emit('update:firstName',$event.target.value)">type="text"
:value="lastName"
@input="$emit('update:lastName',$event.target.value)">
`
})

TemplateM.vue :

<template>
<divclass="template-m-wrap">
<user-namev-model:first-name="firstName"v-model:last-name="lastName"
>user-name>
div>
template>
<script>exportdefault{name:"TemplateM",components:{
},
data(){return{firstName:'dsdsdd',lastName:'Ken'
};
},methods:{
submit(options){console.log(options)
}
},
};script>

效果如下:

c086a370-f217-eb11-8da9-e4434bdf6706.png