Vue组件自定义事件、全局事件总线、消息订阅与发布(pubsub)、$nextTick

目录

  • 1. 组件自定义事件
  • 2. 全局事件总线(GlobalEventBus)
  • 3. 消息订阅与发布(pubsub)
  • 4. this.$nextTick

1. 组件自定义事件

  1. 一种组件间通信的方式,适用于子组件给父组件传递数据。在父组件中给子组件绑定自定义事件,事件的触发在子组件,事件的回调函数在父组件中
  2. 绑定自定义事件:
    1. 第一种方式,在父组件中:<School @myEvent.once="callBackFunc"/>(只能被触发一次)或<School v-on:myEvent="callBackFunc"/>

    2. 第二种方式,在父组件中:先用<School ref="school "/>给子组件注册引用信息,这样就能获取到Student的组件实例对象vc。然后再在父组件中通过生命周期函数mounted进行绑定自定义事件

		mounted() {
		    // this.$refs.student.$once(......)    // 只能被触发一次
		    // 直接在这里实现callBackFunc,如果是普通函数,则普通函数里面的this是Student组件实例对象vc
		    // 如果是箭头函数,箭头函数没有this,则向外找,箭头函数里面的this是父组件的实例对象
			this.$refs.student.$on('myEvent', this.callBackFunc)
		}
  1. 触发自定义事件:在子组件中:this.$emit('myEvent', 'param1', param2)

  2. 事件回调函数:在父组件中:callBackFunc(param1, param2) {…}

  3. 解绑自定义事件:在子组件中:this.$off('myEvent')(解绑一个)、this.$off(['myEvent'])(解绑多个)、this.$off()(解绑所有)

  4. 在父组件中给子组件上绑定原生DOM事件,使用<School @click.native="callBackFunc"/>

使用示例
App.vue:绑定student2App组件自定义事件,事件的回调函数是getStudentName

<template>
	<div>
		<h1>App组件接收Student组件的学生姓名是:{{studentName}}</h1>

		<!-- 父组件给子组件绑定一个自定义事件 -->
		<Student ref="student"/>
	</div>
</template>

<script>
	import Student from './components/Student'

	export default {
		name:'App',
		components:{Student},
		data() {
			return {
				studentName:''
			}
		},
		methods: {
            // 事件的回调函数
			getStudentName(name, ...params){
        console.log(params)
				this.studentName = name
			}
		},
		mounted() {
            // 绑定自定义事件
			this.$refs.student.$on('student2App',this.getStudentName)
		}
	}
</script>

Student.vue:通过两个函数分别进行student2App组件自定义事件的触发和解绑

<template>
	<div>
		<h2>学生姓名:{{name}}</h2>
		<button @click="sendStudentlName">点我把学生名给App</button>
		<button @click="unbind">点我解绑student2App事件</button>
	</div>
</template>

<script>
	export default {
		name:'Student',
		data() {
			return {
				name:'张三'
			}
		},
		methods: {
			sendStudentlName(){
				// 触发Student组件实例的student2App事件
				this.$emit('student2App',this.name,'param1',666)
			},
			unbind(){
                // 解绑多个自定义事件
				this.$off(['student2App'])
			}
		}
	}
</script>

先【点击把学生名给App】的效果如下,再【点击解绑student2App事件】,最后【点击把学生名给App】控制台没有输出
组件自定义事件

可以通过浏览器的Vue插件,查看组件自定义事件的触发记录,如下所示:
自定义事件的触发记录

2. 全局事件总线(GlobalEventBus)

一种组件间通信的方式,适用于任意组件间通信

示例如下:
main.js:安装全局事件总线,$bus就是当前应用的vm

import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false

new Vue({
	el:'#app',
	render: h => h(App),
	beforeCreate() {
		// 安装全局事件总线
		Vue.prototype.$bus = this
	}
})

App.vue

<template>
	<div>
		<School/>
		<Student/>
	</div>
</template>

<script>
	import Student from './components/Student'
	import School from './components/School'

	export default {
		name:'App',
		components:{School,Student}
	}
</script>

School.vue:

  1. 使用事件总线之接收数据:School组件想接收数据,则在School组件中给$bus绑定组件自定义事件,事件的回调函数在School组件中
  2. 在beforeDestroy回调函数中,用$bus.$off去解绑当前组件所用到的事件
<template>
	<div>
		<h2>学校名称:{{name}}</h2>
	</div>
</template>

<script>
	export default {
		name:'School',
		data() {
			return {
				name:'第一中学'
			}
		},
		mounted() {
      // 给$bus绑定自定义事件
      // 事件回调函数是School组件的。因为事件回调函数里面的this是School实例对象
			this.$bus.$on('student2School',(studentName)=>{
        console.log(this)
				console.log('我是School组件,收到了学生的名字: ', studentName)
			})
		},
		beforeDestroy() {
      // 销毁School组件前,解绑和该组件有关的组件自定义事件
			this.$bus.$off('student2School')
		}
	}
</script>

Student.vue:使用事件总线之提供数据。通过$bus.$emit触发指定的组件自定义事件并传递数据

<template>
	<div>
		<h2>学生姓名:{{name}}</h2>
		<button @click="sendStudentName">把学生名传递给School组件</button>
	</div>
</template>

<script>
	export default {
		name:'Student',
		data() {
			return {
				name:'张三'
			}
		},
		methods: {
			sendStudentName(){
        // 触发$bus的组件自定义事件,同时传递值
				this.$bus.$emit('student2School',this.name)
			}
		}
	}
</script>

点击按钮,控制台输出如下:
全局事件总线

3. 消息订阅与发布(pubsub)

一种组件间通信的方式,适用于任意组件间通信

消息订阅与发布是一种思想,需要借助其它第三方库,这里选择pubsub-js,使用命令cnpm install pubsub-js进行项目包安装。因为浏览器的Vue插件不支持第三方的pubsub-js,所有在Vue的Timeline的Component-events看不到事件记录

School.vue:

  1. 接收数据:School组件想接收数据,则在School组件中订阅topic,订阅的回调函数在School组件中
  2. 取消订阅:最好在beforeDestroy钩子中,用PubSub.unsubscribe(subId)去取消订阅的topic
<template>
	<div>
		<h2>学校名称:{{name}}</h2>
	</div>
</template>

<script>
	import pubsub from 'pubsub-js'
	export default {
		name:'School',
		data() {
			return {
				name:'第一中学'
			}
		},
		mounted() {
			this.subId = pubsub.subscribe('student2SchoolTopic',(topicName, name)=>{
				console.log(this)
				console.log('收到Student发送的消息,学生名字是: ',name)
			})
		},
		beforeDestroy() {
			pubsub.unsubscribe(this.pubId)
		}
	}
</script>

Student.vue:提供数据:使用pubsub.publish('topicName',数据)

<template>
	<div>
		<h2>学生姓名:{{name}}</h2>
		<button @click="sendStudentName">把学生名给School组件</button>
	</div>
</template>

<script>
	import pubsub from 'pubsub-js'
	export default {
		name:'Student',
		data() {
			return {
				name:'张三'
			}
		},
		methods: {
			sendStudentName(){
				pubsub.publish('student2SchoolTopic',this.name)
			}
		}
	}
</script>

点击按钮,控制台输出如下:
消息订阅与发布

4. this.$nextTick

  • 作用:在下一次DOM更新结束后执行其指定的回调函数
  • 什么时候用:当改变数据后,要基于更新后的新DOM进行某些操作时,可以在nextTick所指定的回调函数中实现

App.vue:直接使用this.$refs.inputData.focus()是获取不到焦点的,因为此时input输入框还是隐藏的,等editInput函数执行完才会去重新加载新的DOM。所以使用this.$nextTick等DOM加载完毕后,再去调用this.$refs.inputData.focus()获取焦点

<template>
	<div>
    <span v-show="!isEdit">{{data}}</span>
    <input type="text" v-model="data" v-show="isEdit" @blur="handelBlur" ref="inputData">
    <button @click="editInput">点我编辑文字</button>
	</div>
</template>

<script>


	export default {
		name:'App',
    data() {
      return {
        data:'学习',
        isEdit:false
      }
    },
    methods:{
      editInput() {
        this.isEdit=true
        
        this.$nextTick(function() {
          this.$refs.inputData.focus()
        })
      },
      handelBlur() {
        this.isEdit=false
      }
    }
	}


</script>

点击按钮,input输入框就能自动获取焦点
nextTick

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

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

相关文章

【机器学习】和【人工智能】在物理学领域的应用以及代码案例分析

作者主页: 知孤云出岫 目录 作者主页:1. 数据驱动的物理模型预测应用概述案例分析&#xff1a;流体动力学中的湍流预测代码示例 代码分析 2. 实验数据分析与噪声消除应用概述案例分析&#xff1a;光谱数据去噪代码示例 代码分析 3. 物理定律的自动发现应用概述案例分析&#…

高压挑战:新能源汽车换电连接器的技术革新

摘要 随着汽车行业的电动化、网联化和智能化发展&#xff0c;新能源汽车连接器的使用量从传统汽车的600个左右增加到800至1000个。新能源汽车连接器在电连接和信号连接方面更为复杂&#xff0c;包括低压连接器和高压连接器。高压连接器面临严苛性能要求&#xff0c;如耐热性、…

[SUCTF 2018]annonymous1

知识点&#xff1a; 匿名函数创建其实有自己的名字&#xff08;%00lambda_%d&#xff09; 进入页面开始代码审计. <?php // 使用 create_function 创建一个匿名函数&#xff0c;该函数调用 die() 函数并执行 cat flag.php 命令&#xff08;在服务器上执行&#xff0c;如果…

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配&#xff08;Exact Match&#xff09;2. 正则表达式匹配&#xff08;Regex Match&#xff09;3. 前缀匹配&#xff08;Prefix Match&#xff09; 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中&#xff0…

1658.将x减到0的最小操作数

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;滑动窗口&#xff09; 题目要求从最左边或者最右边移除元素&#xff0c;需要思考两侧&#xff0c;这是比较麻烦的。 正难则反&#xff0c;我们逆向思维一下&#xff0c;最后剩余的元素是不是中间的连续区间&#xf…

服务器数据恢复—OneFS文件系统下数据被删除的数据恢复案例

服务器数据恢复环境&故障&#xff1a; EMC NAS&#xff08;Isilon S200&#xff09;&#xff0c;共3个节点&#xff0c;每个节点配置12块STAT硬盘。数据分两部分&#xff1a;一部分数据为vmware虚拟机&#xff08;WEB服务器&#xff09;&#xff0c;通过NFS协议共享到ESX主…

Subclass-balancing Contrastive Learning for Long-tailed Recognition

文章目录 SCL(supervised contrastive learning)1. 监督对比学习&#xff08;SCL&#xff09;的基本概念2. SCL的损失函数3. 长尾数据集的问题4. k-正样本对比学习&#xff08;KCL&#xff09;的引入5. 总结 SBCL举例说明&#xff1a;狗的分类 关键点&#xff1a;划分为多个子类…

Golang | Leetcode Golang题解之第386题字典序排数

题目&#xff1a; 题解&#xff1a; func lexicalOrder(n int) []int {ans : make([]int, n)num : 1for i : range ans {ans[i] numif num*10 < n {num * 10} else {for num%10 9 || num1 > n {num / 10}num}}return ans }

性能测试经典案例解析——政务查询系统

各位好&#xff0c;我是 道普云 一站式云测试SaaS平台。一个在软件测试道路上不断折腾十余年的萌新。 欢迎关注我的主页 道普云 文章内容具有一定门槛&#xff0c;建议先赞再收藏慢慢学习&#xff0c;有不懂的问题欢迎私聊我。 希望这篇文章对想提高软件测试水平的你有所帮…

11--kubernetes的Ingress应用

前言&#xff1a;本章主要记录ingress暴露服务方式&#xff0c;会详细解释其原理及两种网络模式应用实操。 1、Ingress概念详解 Kubernetes 暴露服务的方式目前只有三种&#xff1a;LoadBlancer Service、NodePort Service、Ingress&#xff0c;Service属于4层负载均衡&#…

线程相关内容

线程 一、介绍二、thread库1、构造函数&#xff08;1&#xff09;函数&#xff08;2&#xff09;说明&#xff08;3&#xff09;注意 2、join函数3、detach4、joinable函数5、get_id函数 三、mutex的种类1、mutex&#xff08;1&#xff09;介绍&#xff08;2&#xff09;lock&a…

水晶连连看 - 无限版软件操作说明书

水晶连连看 – 无限版游戏软件使用说明书 文章目录 水晶连连看 – 无限版游戏软件使用说明书1 引言1.1 编写目的1.2 项目名称1.3 项目背景1.4 项目开发环境 2 概述2.1 目标2.2 功能2.3 性能 3 运行环境3.1 硬件3.2 软件 4 使用说明4.1 游戏开始界面4.2 游戏设定4.2.1 游戏帮助4…

长短期记忆神经网络-LSTM回归预测-MATLAB代码实现

一、LSTM简介&#xff08;代码获取&#xff1a;底部公众号&#xff09; 长短期记忆神经网络&#xff08;Long Short-Term Memory, LSTM&#xff09;是一种循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;的变体。相比于传统的RNN&#xff0c;LSTM能够更好…

如何在mac上玩使命召唤手游?苹果电脑好玩的第一人称射击游戏推荐

《使命召唤4&#xff1a;现代战争》&#xff08;Call of Duty 4: Modern Warfare&#xff09;是由Infinity Ward开发并于2007年发行的第一人称射击游戏。该游戏是《使命召唤》系列的第四部作品&#xff0c;是一款非常受欢迎的游戏之一&#xff0c;《使命召唤4&#xff1a;现代战…

【Linux操作系统】线程控制

目录 一、线程创建二、线程等待三、线程退出四、线程的优缺点五、多线程的创建六、C11的多线程七、线程分离 一、线程创建 使用接口pthread_create创建新线程&#xff0c;头文件是pthread.h #include <iostream> #include <unistd.h> #include <pthread.h>…

2024国赛数学建模-模拟火算法(MATLAB 实现)

模拟退火算法 1.1 算法原理 模拟退火算法的基本思想是从一给定解开始 ,从邻域 中随机产生另一个解 ,接受 Metropolis准则允许目标函数在 有限范围内变坏 ,它由一控制参数 t决定 ,其作用类似于物 理过程中的温度 T,对于控制参数的每一取值 ,算法持续进 行“产生 —判断 —接受…

部署Apache网站

简易部署自己的apache网站 写在前面&#xff1a;先安装好mysql&#xff0c;再来搭建站点 1.安装php [rootlocalhost ~]# yum install php -y ##安装了php&#xff0c;默认会和apache结合工作2.创建文件编写php网页代码 [rootlocalhost ~]# vim /var/www/html/index.php ##创…

uniapp交互反馈

页面交互反馈可以通过:uni.showToast(object)实现,常用属性有 ioc值说明 值说明success显示成功图标&#xff0c;此时 title 文本在小程序平台最多显示 7 个汉字长度&#xff0c;App仅支持单行显示。error显示错误图标&#xff0c;此时 title 文本在小程序平台最多显示 7 个汉字…

【C++进阶】hash表的封装

文章目录 hash表哈希表的关键组成部分哈希表的优缺点优点&#xff1a;缺点&#xff1a; 常见应用场景 开放定址法实现hash表负载因子 (Load Factor)负载因子的意义负载因子的影响再散列 (Rehashing)示例 整体框架insertFinderasehash桶封装框架insertfinderase~HashTable() 总结…

Apache ShardingSphere数据分片弹性伸缩加解密中间件

Apache ShardingSphere Apache ShardingSphere 是一款分布式 SQL 事务和查询引擎,可通过数据分片、弹性伸缩、加密等能力对任意数据库进行增强。 软件背景 ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding…