Vue 自定义事件绑定与解绑

绑定自定义事件

说到 Vue 自定义事件,那就需要搞清楚一个问题,为啥有这个玩意。

说到自定义事件之前,需要理解 组件基础的概念。理解了基础概念之后,我们就知道 Vue 的父子之间的通信, 一是  父组件通过 Prop 向子组件传递数据 。二是 监听子组件事件。

具体详情参考之前的博文:Vue-父子组件传值。

vue-07-父子组件传值_vue handler(n) {}_白桃味稠鱼烧的博客-CSDN博客因为vue 的数据是单向流动的,这是为了避免数据污染。在官方文档中也说到:所有的 prop 都使得其父子 prop 之间形成了一个单向下行绑定:父级 prop 的更新会向下流动到子组件中,但是反过来则不行。这样会防止从子组件意外改变父级组件的状态,从而导致你的应用的数据流向难以理解。大致归纳一下:父传子--传值、子传父--传事件1、父传子如果传递的数据是对象格式的,那么在子组件 内部监..._vue handler(n) {}https://blog.csdn.net/qq_40792800/article/details/105559859这篇博文中详细说明了 父子组件传值的方法,其中就有 子组件传递数据给父组件的三种方法,其实就是 通过自定义事件 来实现的。实现方法也在其中详细说明了。

$off:解绑自定义事件

 上面说过了 通过绑定自定义事件,实现了子组件向父组件传递数据,那么既然有绑定方法,就应该和原生js一样,有解绑的方法,也存在解绑的方法,那就是 $off() 。

  • 如果没有提供参数,则移除所有的事件监听器;

  • 如果只提供了事件,则移除该事件所有的监听器;

  • 如果同时提供了事件与回调,则只移除这个回调的监听器

父组件只使用一种绑定方法

<School @test="test"/>methods: {test(val) {console.log(val,'这是子组件传递过来的数据')},
},

子组件解绑事件

1、只提供事件,则移除该事件所有的监听器( 只传递一个事件和传递多个事件 )

<template><div><p class="demo" @click="goto">School组件</p><p @click="unbind">解绑事件</p></div>
</template>export default {data() {return {msg: "子组件数据",};},methods: {goto() {this.$emit("test", this.msg);},unbind() {console.log("解绑事件");this.$off('test');  // 若只传递一个参数,则只解绑一个自定义事件this.$off(['test1','tset2','test3']);  // 若传递一个数组,则同时解绑传递的多个自定义事件},},
};

触发父组件事件之后,点击触发解绑事件,再次触发父组件事件,无法打印出子组件数据

 2、同时提供了事件与回调,则只移除这个回调的监听器

  • 我在子组件的 mounted 生命周期中 监听了 myEvent 事件,且该事件上存在两个回调函数
  • 点击 测试按钮时,$emit 触发 myEvent 事件,myEvent 事件上的回调函数全部触发
  • 点击解绑按钮,解绑 myEvent 事件 上的 this.myCallback() 函数,只剩下 匿名函数
  • 再次点击 测试按钮,发现 myEvent 事件 上,this.myCallback() 函数不触发,匿名函数触发
<template><div><p @click="test">测试</p><p @click="remove">解绑myCallback</p></div>
</template><script>
export default {mounted() {// 添加事件监听器,在组件挂载后执行 myCallback 函数this.$on('myEvent', this.myCallback);this.$on('myEvent', () => {console.log('我是匿名函数,我被触发了')});},methods: {test() {this.$emit('myEvent')},remove() {console.log('我解绑了myCallback,但是没有解绑匿名函数')this.$off('myEvent',this.myCallback)},myCallback() {console.log('我是myCallback,我被触发了')}},
};
</script>

 

 ps:$on 监听事件之后,需要 $emit 触发事件监听,才去执行 $off,不然绑定的事件没触发,看不出来效果( 绑定事件都不触发,你解绑它干啥,直接不监听就行了啵 )

3、 如果没有提供参数,则移除所有的事件监听器

在父组件中给 School子组件 绑定两个自定义事件

<School @test="test" @test1="test1"/>methods: {test(val) {console.log(val,'这是子组件传递过来的数据')},test1(val) {console.log(val,'这是子组件传递过来的数据1')},
},

在子组件中触发两个绑定的自定义事件

<template><div><p @click="bind">绑定</p><p @click="remove">解绑</p></div>
</template><script>
export default {methods: {bind() {this.$emit('test','test')this.$emit('test1','test1')},remove() {this.$off()},},
};
</script>
  • 点击 bind 触发绑定事件,控制台上会打印出数据。
  • 点击 remove 移除所有绑定事件。
  • 再次点击 bind 触发绑定事件,控制台无输出,表明所有绑定事件已移除

 Vue destroyed() 生命周期

 实例销毁后调用。该钩子被调用后,对应 Vue 实例的所有指令都被解绑,所有的事件监听器被移除,所有的子实例也都被销毁。

<template><div><p @click="bind">绑定</p><p @click="death">销毁子组件</p></div>
</template><script>
export default {methods: {bind() {this.$emit('test','test')this.$emit('test1','test1')},death() {this.$destroy()}},
};
</script>
  • 点击 bind 按钮,触发绑定函数,控制台上输出。
  • 点击 销毁子组件 按钮,销毁子组件,移除所有事件监听器,解绑所有指令
  • 再次点击 bind 按钮,控制台无输出

总结

 1、组件的自定义事件是一种组件间的通信方式:子组件 向 父组件 传递数据

2、使用场景:子组件B 向 父组件A 传递数据,需要在 父组件A 中给 子组件B 绑定自定义事件( 事件的回调在 A 中 )

3、绑定自定义事件:

  • 第一种方式:在父组件中 
  • <School @test="test"/><School v-on:test="test"/>
  • 第二种方式:在父组件中
  • <School ref='student'/>mounted() {this.$refs.student.$on('qwe', this.getname)
    }
  • 第三种方式:若想让自定义事件只能触发一次,可以使用 once 修饰符,或 $ones 方法

4、触发自定义事件 

this.$emit('test','向传递的数据')

 5、解绑自定义事件

this.$off()

6、也可以使用  生命周期钩子函数 this.$destroy() 来销毁组件达到解绑所有自定义事件

7、组件上也可以绑定 原生DOM事件,使用  .native 事件。即使是 @click 事件,Vue也不会将其解析为 自定义事件,不用在 School 子组件中 使用 $emit 触发

<School @click.native="test"/>

8 、注意:通过 this.$refs.xxx.$on( 'xxx' , callback ),绑定自定义事件时,callback 回调要么配置在 mtenods 中,要么使用箭头函数,否则 this 指向存在问题( 因为 callback 函数接收的参数都是从子组件中传递的,包括 this也是,如果使用 function () {} 函数,则该函数内部 this 指向子组件 )

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/54699.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

动态规划之树形DP

动态规划之树形DP 树形DP何为树形DP 树形DP例题HDU-1520 Anniversary partyHDU-2196 Computer834. 树中距离之和 树形DP 何为树形DP 树形DP是指在“树”这种数据结构上进行的动态规划&#xff1a;给出一颗树&#xff0c;要求以最少的代价&#xff08;或取得最大收益&#xff…

1、Spark SQL 概述

1、Spark SQL 概述 Spark SQL概念 Spark SQL is Apache Spark’s module for working with structured data. 它是spark中用于处理结构化数据的一个模块 Spark SQL历史 Hive是目前大数据领域&#xff0c;事实上的数据仓库标准。 Shark&#xff1a;shark底层使用spark的基于…

针对高可靠性和高性能优化的1200V碳化硅沟道MOSFET

目录 标题&#xff1a;1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance摘要信息解释研究了什么文章创新点文章的研究方法文章的结论 标题&#xff1a;1200V SiC Trench-MOSFET Optimized for High Reliability and High Performance 摘要 本文详…

Jenkins工具系列 —— 插件 钉钉发送消息

文章目录 安装插件 Ding TalkJenkins 配置钉钉机器人钉钉APP配置项目中启动钉钉通知功能 安装插件 Ding Talk 点击 左侧的 Manage Jenkins —> Plugins ——> 左侧的 Available plugins Jenkins 配置钉钉机器人 点击 左侧的 Manage Jenkins &#xff0c;拉到最后 钉…

《数据同步-NIFI系列》Nifi配置UpdateAttribute实现字符串时间戳转日期

Nifi配置UpdateAttribute实现字符串时间戳转日期 数据处理流程如下&#xff1a;查询源数据库&#xff0c;将Avro转为Json格式&#xff0c;然后使用EvaluateJsonPath修改字段名&#xff0c;最后使用replaceText将参数组成SQL&#xff0c;最后PutSQL。 一、字段串时间戳导致无法插…

嵌入式开发学习(STC51-13-温度传感器)

内容 通过DS18B20温度传感器&#xff0c;在数码管显示检测到的温度值&#xff1b; DS18B20介绍 简介 DS18B20是由DALLAS半导体公司推出的一种的“一线总线&#xff08;单总线&#xff09;”接口的温度传感器&#xff1b; 与传统的热敏电阻等测温元件相比&#xff0c;它是一…

java中javamail发送带附件的邮件实现方法

java中javamail发送带附件的邮件实现方法 本文实例讲述了java中javamail发送带附件的邮件实现方法。分享给大家供大家参考。具体分析如下&#xff1a; JavaMail&#xff0c;顾名思义&#xff0c;提供给开发者处理电子邮件相关的编程接口。它是Sun发布的用来处理email的API。它…

vim、awk、tail、grep的使用

vim命令 $定位到光标所在行的行末^定位到光标所在行的行首gg定位到文件的首行G定位到文件的末行dd删除光标所在行ndd删除n行&#xff08;从光标所在行开始&#xff09;D删除光标所在行&#xff0c;使之变为空白行x删除光标所在位置字符nx删除n个字符&#xff0c;从光标开始向后…

【linux源码学习】【实验篇】使用bochs运行linux0.11系统(搭建一个自己的工作站)

目录 背景资源获取bochs环境搭建windowsbochs环境搭建linux声明 背景 最近看赵炯老师的《linux内核完全注释》&#xff0c;然后在最后一个习题里面看到使用bochs跑一下0.11的内核代码&#xff0c;本来觉得很难&#xff0c;但是如果做过一遍就会发现其实很简单&#xff0c;这个…

No112.精选前端面试题,享受每天的挑战和学习

文章目录 说一说JavaScript有几种方法判断变量的类型&#xff1f;说一说defer和async区别&#xff1f;HTTP&#xff08;超文本传输协议&#xff09;是什么&#xff1f;说一下浏览器输入URL发生了什么&#xff1f;一只青蛙一次可以跳上1级台阶&#xff0c;也可以跳上2级。求该青…

学python的心得体会1000字,学python的心得体会2000字

这篇文章主要介绍了学python的心得体会2000字&#xff0c;具有一定借鉴价值&#xff0c;需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获&#xff0c;下面让小编带着大家一起了解一下。 1. 初学者应该从简单的练习开始&#xff0c;先掌握基本的语法和概念&#xff0c;…

如何用python做自然语言处理

如何用python做自然语言处理 使用Python进行自然语言处理&#xff08;NLP&#xff09;是非常常见和强大的。以下是一些基本步骤&#xff1a; 安装所需的库&#xff1a; 首先&#xff0c;您需要安装一些用于自然语言处理的Python库&#xff0c;如NLTK&#xff08;自然语言工具包…