Vue23组件自定义事件 和 解绑事件

Vue2&3组件自定义事件 和 解绑事件

Vue2组件自定义事件

  • 功能:父组件绑定数据,子组件触发事件。(父绑子触发)

在这里插入图片描述

  • 实现步骤(前三步在父组件实现,第四步在子组件实现):
    • 第一步:提供事件(组件)源
    • 第二步:给组件绑定事件(v-on:)
    • 第三步:编写回调函数,并和事件进行绑定
    • 第四步:等待事件的触发,只要事件触发,则执行回调函数。

使用方法:

  • vm.$emit(event, arg) //触发当前实例上的时间

第一种方式:在组件标签上绑定事件

// 父组件
<template>
    <div>
        // 第一步:提供事件(组件)源
        // 第二步:给组件绑定事件(v-on:简写 => @)
        <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() {
            /*
                function函数是被this.$refs.user调用的,
                而this.$refs.user调用的是User标签,
                User标签是User组件的,
                所以这里的this调的是User实例
            */
            this.$refs.user.$on('event', function(){
                // 这里的this是子组件的实例,也就是User组件实例
                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,
                所以只能往上找mounted,
                而mounted是App父组件的,
                所以this调的是App组件实例
            */
            this.$refs.user.$on('event', () => {
                // 这里的this是父组件的实例,也就是App组件实例
                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参数接受的数据来搭配使用
// App.vue
<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>
// Info.vue
<template>
    <button @click="triggerEvent1">触发event1事件</button>
</template>

<script>
    export default {
        name : 'Info',
        // context表示组件上下文
        // 这里的props参数使用的是props配置项接受的数据
        setup(props, context){
            function triggerEvent1(){
                context.emit('event1', '张三')
            }
            
            return {triggerEvent1}
        }
    }
</script>

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

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

相关文章

测试用例的设计方法(黑盒)

1.基于需求的设计方法 比如针对网易邮箱进行测试&#xff1a;分为功能相关和非功能相关两大类 但是这么设计的话&#xff0c;有无数多个测试用例&#xff0c;我们现在看到的只是一些大概的测试用例&#xff0c;要想设计具体的测试用例&#xff0c;需要用到下面测试用例的方法…

盘点双11!阿里妈妈助这些品牌短视频赢增长!

刚刚&#xff01;一年一度的双11落下帷幕&#xff0c;很多新变化值得回味。 尽管天气在变凉&#xff0c;但市场出现了逐渐回暖的迹象。在此背景下&#xff0c;大量商家特别关心如何在双11打一场漂亮的胜仗。 卖方如何行动&#xff0c;关键在于买方的变化。在阿里妈妈发布的《…

神经网络(第二周)

一、简介 1.1 需求预测示例 1.1.1 逻辑回归算法 根据价格预测商品是否畅销。特征&#xff1a;T恤的价格&#xff1b;分类&#xff1a;销售量高1/销售量低0&#xff1b;使用逻辑回归算法进行分类&#xff0c;拟合效果如下图所示&#xff1a; 1.1.2 神经元和神经网络 将逻辑回…

【LeetCode刷题-二分查找】--162.寻找峰值

162.寻找峰值 方法一&#xff1a;寻找最大值 题目保证了nums[i]≠nums[i1]&#xff0c;所以数组nums中最大值两侧的元素一定严格小于最大值本身&#xff0c;因此最大值所在的位置就是一个可行的峰值位置 class Solution {public int findPeakElement(int[] nums) {int idx 0…

分类网络搭建示例

搭建CNN网络 本章我们来学习一下如何搭建网络&#xff0c;初始化方法&#xff0c;模型的保存&#xff0c;预训练模型的加载方法。本专栏需要搭建的是对分类性能的测试&#xff0c;所以这里我们只以VGG为例。 请注意&#xff0c;这里定义的只是一个简陋的版本&#xff0c;后续一…

什么是数据库事务、事务的ACID、怎么设置/禁止自动提交?

数据库事务及ACID 数据库事务是指作为单个逻辑工作单元执行的一组操作。这组操作要么全部成功地执行&#xff0c;要么全部不执行&#xff0c;不允许出现部分执行的情况。数据库事务通常需要满足ACID属性&#xff0c;即原子性&#xff08;Atomicity&#xff09;、一致性&#x…

第2关:还原键盘输入(list)

题目&#xff1a; 知识点&#xff1a; 列表list相较于数组&#xff1a; 优势&#xff1a;可在任意指定位置插入或者删除元素而不影响列表其他地方 。 劣势&#xff1a;无法直接进行下标索引&#xff0c;需要迭代器it逐个遍历。 代码&#xff1a; #include <iostream>…

企业级信息化系统 ERP、OA、CRM、EAM、WMS、MES、PM

微服务架构&#xff0c;前端采用微应用架构&#xff0c;可做到不同服务使用不同数据库独立运行。全平台采用基于模型驱动的设计模式&#xff0c;并在前后端留有大量的代码植入入口&#xff0c;方便开发者对平台进行改造扩充。企业信息中心开发ERP、OA、CRM、EAM、WMS、MES、PM等…

R系组播调优方案

修改/etc/sysctl.conf添加如下内容&#xff1a; Vim /etc/sysctl.con net.ipv4.ip_forward1 net.ipv4.ip_nonlocal_bind1 net.ipv4.conf.all.rp_filter0 net.ipv4.conf.default.rp_filter0 net.bridge.bridge-nf-call-arptables 0 net.bridge.bridge-nf-call-ip6tables 0 …

【踩坑】Putty报错: Can’t agree a key change algorithm

原因可能是putty版本太老了&#xff0c;更新putty就好了 下载地址&#xff1a;https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 根据需要选择自己想要下载的版本&#xff0c;我是下载的如下图所示的版本。 另外&#xff0c;了解了一下Putty是用来远程连接…

用excel计算一个矩阵的逆矩阵

假设我们的原矩阵是一个3*3的矩阵&#xff1a; 125346789 我们现在要求该矩阵的逆矩阵&#xff1a; 鼠标点到其它空白的地方&#xff0c;用来存放计算结果&#xff1a; 插入-》函数&#xff1a; 选择MINVERSE函数&#xff0c;这个就是求逆矩阵的函数&#xff1a; 点击“继续…

怎么改变容易紧张的性格?

容易紧张的性格是比较通俗的说法&#xff0c;在艾森克人格测试中&#xff0c;容易紧张的性格就属于神经症人格&#xff0c;神经质不是神-经-病&#xff0c;而是一种人格特征&#xff0c;这种特征包括&#xff1a;敏感&#xff0c;情绪不稳定&#xff0c;易焦虑和紧张。有兴趣的…

中国电子学会2023年09月份青少年软件编程Python等级考试试卷六级真题(含答案)

2023-09 Python六级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 以下选项中&#xff0c;不是tkinter变量类型的是&#xff1f;&#xff08;D &#xff09;(2分) A.IntVar() B.StringVar() C.Do…

Redis缓存穿透、击穿和雪崩

文章目录 前言一、缓存穿透&#xff08;查不到&#xff09;1.概念2.解决方案布隆过滤器缓存空对象 二、缓存击穿&#xff08;量太大&#xff0c;缓存过期&#xff01;&#xff09;1.概述2.解决方案1.设置热点数据永不过期2.加互斥锁 三、缓存雪崩1.概念2.解决方案1.redis高可用…

Xilinx DDR3 MIG系列——ddr3控制器的时钟架构

本节目录 一、ddr3控制器的时钟架构 1、PLL输入时钟——系统时钟system_clk 2、PLL输出时钟——sync_pulse、mem_refclk、freq_refclk、MMCM1的输入时钟 3、MMCM1的输入时钟和输出时钟 4、MMCM2的输入时钟和输出时钟一、ddr3控制器的时钟架构 对于FPGA开发来说,调用IP或者移植…

PHP开源自动化平台CRUD代码生成器

生成CRUD&#xff08;创建、读取、更新、删除&#xff09;代码的实现方式有很多种&#xff0c; 一、实现方式 1. 定义数据模型&#xff1a;首先需要定义数据模型&#xff0c;包括表结构、字段以及数据类型等。 2. 自动生成数据库表&#xff1a;根据数据模型&#xff0c;使用数…

利用爬虫采集外卖数据进行竞争对手分析

目录 一、引言 二、准备工作 三、爬取数据 四、数据处理与存储 五、竞争对手分析 六、结论与展望 一、引言 在当今的数字化时代&#xff0c;数据已经成为企业成功的关键因素之一。对于餐饮外卖行业来说&#xff0c;数据的收集和分析尤为重要。通过对竞争对手的数据进行采…

【LeetCode刷题笔记】滑动窗口

992. K 个不同整数的子数组 解题思路: 滑动窗口 , 题目问题转化为: 求 「最多存在 K 个不同整数的子数组的个数」 与 「最多存在 K - 1 个不同整数的子数组的个数」 之差, 就是题目所求的 「恰好存在 K 个不同整数的子数组的个数」 , 最终问题就变成求解滑动窗口内,以 R …

webpack工作原理

目录 合并代码模块化webpack 的打包webpack 的结构webpack 的源码addEntry 和 _addModuleChainbuildModuleCompilation 的钩子产出构建结果 了解 webpack 实现原理&#xff0c;掌握 webpack 基础的工作流程&#xff0c;在平时使用 webpack 遇见问题时&#xff0c;能够帮助我们洞…

2015年计网408

第33题 通过 POP3 协议接收邮件时, 使用的传输层服务类型是( ) A. 无连接不可靠的数据传输服务 B. 无连接可靠的数据传输服务 C. 有连接不可靠的数据传输服务 D. 有连接可靠的数据传输服务 本题考察邮件接收协议POP3使用的运输层服务类型。 如图所示。接收方用户代理使用pop…