0
点赞
收藏
分享

微信扫一扫

Vue.js---自定义事件

愚鱼看书说故事 2022-03-30 阅读 52

        自定义事件可以用于父子组件之间传递数据,与 props 相比,自定义事件传递数据的优势是可以进行事件的解绑,也就是可以做到动态地传递数据,开发起来更加灵活。

基本语法:

绑定事件:在父组件进行
法1:
<Student @baciii="demo"/>
<Student v-on:baciii="demo"/>

法2:
this.$refs.student.$on('baciii',this.demo);

执行自定义事件:
<button @click="sendstudentname">
sendstudentname(){
    this.$emit('baciii',this.name);
}

解绑事件:在子组件进行
法1:
this.$off('baciii');//解绑一个事件

法2:
this.$off(['baciii','demo1']);//解绑多个事件用数组

法3:
this.$off();//解绑所有自定义事件

简要解释:

  • 首先在父组件中给子组件绑定自定义事件,可以在子组件标签上绑定,@+事件名 / v-on+时间名=“该事件的回调函数”。也可以通过 ref 配置项让父组件得到子组件的真实 DOM 元素,再通过 $on 绑定自定义事件和回调函数,这种方法较为灵活,可以在某些指定时间点再进行绑定。而通过 v-on 的方法在页面加载时即进行绑定。
  • 在子组件中通过某种事件利用 $emit() 触发自定义事件并传递参数,触发时即调用父组件对应的回调函数,子组件中传递的参数会作为回调函数的参数使用,这样就做到了给父组件传递子组件的数据。
  • 解绑事件则分为三种方式通过 $off() 分别对应单事件、多事件、全部事件解绑。

注意事项:

        当当前组件/ Vue 实例生命周期结束时,所有自定义事件随即解绑,但是 js 原生的事件仍保持正常作用,如 click、keydown等

        若想要给子组件绑定原生 js 事件,如 click 等,需要加上 native 修饰符。否则统一当作自定义事件

<student @click.native="demo"/>

        事件绑定的三种写法:第二种方法不能正常执行(此处 this.demo 为父组件上的 methods,this.name 为父组件上的 data)

this.$refs.student.$on('baciii',this.demo);

this.$refs.student.$on('baciii', function(name) {
    this.name = name;
})

this.$refs.student.$on('baciii', name => {
    this.name = name;
})

        第二种方法直接把一个简单函数作为回调函数写在 $on 绑定自定义事件时,那么此处函数中的 this 默认为触发该事件的主体,则子组件的实例化对象,数据也就不能正常传递到父组件上。

        而方法三中使用箭头函数则不会出现该问题,函数会寻找到父组件的实例化对象作为执行时的this。

        方法一则是调用了父组件上的 methods ,methods 上的函数只要不写成箭头函数,那么函数的 this 指向永远为当前组件的实例化对象。箭头函数的 this 指向为 window。

欢迎指正!

举报

相关推荐

0 条评论