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 指向子组件 )

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qt系列-qt6在线安装慢的问题

.\qt-unified-windows-x64-online.exe --mirror https://mirrors.aliyun.com/qt/下载速度飞快

就业并想要长期发展选数字后端还是ic验证?

“就业并想要长期发展选数字后端还是ic验证&#xff1f;” 这是知乎上的一个热点问题&#xff0c;浏览量达到了13,183。看来有不少同学对这个问题感到疑惑。之前更新了数字后端&数字验证的诸多文章&#xff0c;从学习到职业发展&#xff0c;都写过&#xff0c;唯一没有做过…

Mybatis 知识点

Mybatis 知识点 1.1 Mybatis 简介 1.1.1 什么是 Mybatis Mybatis 是一款优秀的持久层框架支持定制化 SQL、存储过程及高级映射Mybatis 几乎避免了所有的 JDBC 代码和手动设置参数以及获取结果集MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO…

代码随想录算法训练营第三十二天 | 全是没接触过的知识点,要复习

以下题目多次复习 200 岛屿数量未看解答自己编写的青春版重点本题的解题思路&#xff0c;也是之前没有接触过的&#xff0c;四字总结&#xff1a;学会感染&#xff01; 题解的代码日后复习重新编写 32 最长有效括号未看解答自己编写的青春版重点这道题&#xff0c;动态规划的思…

小鹏遭遇“动荡”,自动驾驶副总裁吴新宙离职,现已完成团队过渡

根据最新消息&#xff0c;小鹏汽车的自动驾驶副总裁吴新宙宣布将加入全球GPU芯片巨头英伟达。吴新宙将成为该公司全球副总裁&#xff0c;直接向英伟达全球CEO黄仁勋汇报。小鹏汽车董事长何小鹏和吴新宙本人已在微博上确认该消息&#xff0c;并解释离职原因涉及家庭和多方面因素…

Spark提交流程

客户端通过脚本将任务提交到yarn执行&#xff0c;yarn启动APPMaster&#xff0c;APPMaster启动Driver线程&#xff0c;Driver负责初始化SparkContext并进行任务的切分和分配任务&#xff0c;交给Executor进行计算。

质数(判定质数 分解质因数 筛质数)

这里写目录标题 一、判定质数思路分析代码实现 二、分解质因数思路分析典型题目代码实现 三、质数筛经典题目思路分析1. 朴素筛法2. 埃氏筛法3. 欧拉筛法 一、判定质数 思路分析 由于每个合数的因子是成对出现的&#xff0c;即如果 d d d 是 n n n 的因子&#xff0c;那么 …

Qt实现引导界面UITour

介绍 最近做了一款键鼠自动化&#xff0c;想第一次安装打开后搞一个引导界面&#xff0c;找了好多资料没啥参考&#xff0c;偶然发现qt有引导界面如下图。 Qt整挺好&#xff0c;但是未找到源码&#xff0c;真的不想手撸&#xff0c;(源码找到了但是Qt整起来太复杂,没法拿来直接…

Python系统学习1-2

目录 一、硬件 二、软件&#xff1a;程序文档 三、基础知识 四、python执行过程 五、Pycharm使用技巧 一、硬件 计算机五大部件&#xff1a;运算器&#xff0c;存储器&#xff0c;控制器、输入设备&#xff0c;输出设备。 运算器和控制器 集成在CPU中。 存储&#xff1a…

Qt Creator 11 开放源码集成开发环境新增集成终端和 GitHub Copilot 支持

导读Qt 项目今天发布了 Qt Creator 11&#xff0c;这是一款开源、免费、跨平台 IDE&#xff08;集成开发环境&#xff09;软件的最新稳定版本&#xff0c;适用于 GNU/Linux、macOS 和 Windows 平台。 Qt Creator 11 的亮点包括支持标签、多外壳、颜色和字体的集成终端模拟器&am…

hcip——BGP实验

要求 1.搭建toop 2.地址规划 路由器AS接口地址R11 loop0:1.1.1.1 24 loop1 : 192.168.1.1 24 g0/0/0 12.0.0.1 24 R22 64512 g0/0/0: 12.0.0.2 24 g/0/01: 172.16.0.2 19 g0/0/2: 172.16.96.2 19 R32 64512g0/0/0: 172.16.0.3 19 g0/0/1:1…

在使用Python爬虫时遇到解析错误解决办法汇总

在进行Python爬虫任务时&#xff0c;遇到解析错误是常见的问题之一。解析错误可能是由于网页结构变化、编码问题、XPath选择器错误等原因导致的。为了帮助您解决这个问题&#xff0c;本文将提供一些实用的解决办法&#xff0c;并给出相关的代码示例&#xff0c;希望对您的爬虫任…

实现Feed流的三种模式:拉模式、推模式和推拉结合模式

在互联网产品中&#xff0c;Feed流是一种常见的功能&#xff0c;它可以帮助我们实时获取我们关注的用户的最新动态。Feed流的实现有多种模式&#xff0c;包括拉模式、推模式和推拉结合模式。在本文中&#xff0c;我们将详细介绍这三种模式&#xff0c;并通过Java代码示例来实现…

Centos7 安装man中文版手册

查找man中文安装包&#xff1a; yum search man-pages 安装man-pages-zh-CN.noarch: yum install -y man-pages-zh-CN.noarch

05|Oracle学习(UNIQUE约束)

1. UNIQUE约束介绍 也叫&#xff1a;唯一键约束&#xff0c;用于限定数据表中字段值的唯一性。 1.1 UNIQUE和primary key区别&#xff1a; 主键/联合主键每张表中只有一个。UNIQUE约束可以在一张表中&#xff0c;多个字段中存在。例如&#xff1a;学生的电话、身份证号都是…

091.粉刷房子

一、题目 剑指 Offer II 091. 粉刷房子 - 力扣&#xff08;LeetCode&#xff09; 二、代码 class Solution { public:int minCost(vector<vector<int>>& costs) {int row costs.size();int col costs[0].size();if (row 1)return min(min(costs[0][0], cos…

Mybatis ,Mybatis-plus列表多字段排序,包含sql以及warpper

根据 mybatis 根据多字段排序已经wrapper 根据多字段排序 首先根据咱们返回前端的数据列来规划好排序字段 如下&#xff1a; 这里的字段为返回VO的字段,要转换成数据库字段然后加入到排序中 示例&#xff0c;穿了 surname,cerRank 多字段,然后是倒序 false 首先创建好映射&am…

Python元编程-装饰器介绍、使用

目录 一、Python元编程装饰器介绍 二、装饰器使用 1. 实现认证和授权功能 2.实现缓存功能 3.实现日志输出功能 三、附录 1. logging.basicConfig介绍 2. 精确到毫秒&#xff0c;打印时间 方法一&#xff1a;使用datetime 方法二&#xff1a;使用time 一、Python元编程…

【Git】git reflog git log

前言 日常开发过程中&#xff0c;我们经常会遇到要进行版本回退的情况&#xff0c;这时候需要使用git reflog和git reset 命令 git reflog 常用命令&#xff1a; 1、git reflog -n 查看多少条 2、git reflog show origin 查看远程历史变动 git log 什么都不加默认显示当前分…

Python实现GA遗传算法优化循环神经网络回归模型(LSTM回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 遗传算法&#xff08;Genetic Algorithm&#xff0c;GA&#xff09;最早是由美国的 John holland于20世…