Vue2&3组件自定义事件 和 解绑事件
Vue2组件自定义事件
功能:父组件绑定数据,子组件触发事件。(父绑子触发)
实现步骤(前三步在父组件实现,第四步在子组件实现):
第一步:提供事件(组件)源 第二步:给组件绑定事件(v-on:) 第三步:编写回调函数,并和事件进行绑定 第四步:等待事件的触发,只要事件触发,则执行回调函数。
使用方法:
vm.$emit(event, arg)
//触发当前实例上的时间
第一种方式:在组件标签上绑定事件
< template>
< div>
< User @event= "eventBinding" > < / User>
< / div>
< / template>
< script>
import User from './components/User.vue'
export default {
name : 'App' ,
methods : {
eventBinding ( name, age ) {
console. log ( name, age)
}
} ,
components : { User}
}
< / script>
< template>
< div>
< button @click= "triggerEvent" > 触发事件< / button>
< / div>
< / template>
< script>
export default {
name : 'User' ,
data ( ) {
return {
name : '张三' ,
age : 20
}
} ,
methods : {
triggerEvent ( ) {
this . $emit ( 'event' , this . name, this . age)
}
}
}
< / script>
第二种方式(常用):使用refs给组件绑定事件
< template>
< div>
< User ref= "user" > < / User>
< / div>
< / template>
< script>
import User from './components/User.vue'
export default {
name : 'App' ,
mounted ( ) {
this . $refs. user. $on ( 'event' , this . eventBinding)
} ,
methods : {
eventBinding ( name, age ) {
console. log ( name, age)
}
} ,
components : { User}
}
< / script>
< template>
< div>
< button @click= "triggerEvent" > 触发事件< / button>
< / div>
< / template>
< script>
export default {
name : 'User' ,
data ( ) {
return {
name : '张三' ,
age : 20 ,
}
} ,
methods : {
triggerEvent1 ( ) {
this . $emit ( 'event' , this . name, this . age)
}
}
}
< / script>
第一种 和 第二种有什么区别?
其实并没有多大区别,两个用法其实都很多相同的地方,只是放的位置不同而已
第一种:< User @event= "eventBinding" > < / User>
第二种(常用):< User ref= "user" > < / User>
this . $refs. user. $on ( 'event' , this . eventBinding)
ref=“user” 调用时,使用this.$refs.user
@event="eventBinding" == $on('event', this.eventBinding)
第二种的函数形式(不常用)
< template>
< div>
< User ref= "user" > < / User>
< / div>
< / template>
< script>
import User from './components/User.vue'
export default {
name : 'App' ,
mounted ( ) {
this . $refs. user. $on ( 'event' , function ( ) {
console. log ( this )
} )
} ,
methods : {
eventBinding ( name, age ) {
console. log ( name, age)
}
} ,
components : { User}
}
< / script>
< template>
< div>
< User ref= "user" > < / User>
< / div>
< / template>
< script>
import User from './components/User.vue'
export default {
name : 'App' ,
mounted ( ) {
this . $refs. user. $on ( 'event' , ( ) => {
console. log ( this )
} )
} ,
methods : {
eventBinding ( name, age ) {
console. log ( name, age)
}
} ,
components : { User}
}
< / script>
Vue2解绑事件 this.$off()
< template>
< div>
< button @click= "triggerEvent" > 触发事件< / button>
< button @click= "unbinding" > 解绑事件< / button>
< / div>
< / template>
< script>
export default {
name : 'User' ,
data ( ) {
return {
name : '张三' ,
age : 20 ,
}
} ,
methods : {
triggerEvent ( ) {
this . $emit ( 'event' , this . name, this . age)
} ,
unbinding ( ) {
this . $off ( 'event' )
this . $off ( [ 'event' , '' , '' ] )
this . $off ( )
}
}
}
< / script>
Vue3组件自定义事件
setup函数中没有this关键字,所以在调用自定义事件时需要使用setup函数的第二个参数(context)
context表示组件的上下文,用context来调用emit将数据触发给父组件 这里需要和props参数接受的数据来搭配使用
< template>
< User @event1= "showInfo" > < / User>
< / template>
< script>
import Info from './components/Info.vue'
export default {
name : 'App' ,
components : { Info} ,
setup ( ) {
function showInfo ( name ) {
alert ( ` 姓名: ${ name} ` )
}
return { showInfo}
}
}
< / script>
< template>
< button @click= "triggerEvent1" > 触发event1事件< / button>
< / template>
< script>
export default {
name : 'Info' ,
setup ( props, context ) {
function triggerEvent1 ( ) {
context. emit ( 'event1' , '张三' )
}
return { triggerEvent1}
}
}
< / script>