2024年最全vue3 vue2的兄弟组件的传值_vue兄弟组件emit传值,系列教学

对象篇

模块化编程-自研模块加载器

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

  1. 在兄弟PageA中发布事件:
import emitter from '@/utils/bus'
import { ref } from 'vue'
const Aname= ref('我是小虾') 
emitter.emit('handleEvent', Aname)

  1. 在兄弟PageB中监听事件,并在组件销毁时取消监听
import emiiter from '@/utils/bus'
import { ref, onBeforeMount, onUnmounted } from 'vue'
const Bname= ref('') // 等待接收
const handelEventFn1 = (Aname)=>{
 Bname.value = Aname.value
 }


onBeforeMount(() => {
  emiiter.on('handleEvent',handelEventFn1)  // 开启监听,监听到handleEvent事件后,执行handelEventFn1函数,当然你也可以在另外的页面监听handleEvent事件去执行handelEventFn2
})
onUnmounted(() => {
  emiiter.off('handleEvent',handelEventFn) // 取消handleEvent事件的handelEventFn函数监听
  emiiter.off('handleEvent') // 取消handleEvent事件的全部处理函数的监听
})

二、mitt源码解读:

mitt是用new Map()作为整体的事件处理中心的
而JavaScript的对象(Object),本质上是键值对的集合(Hash结构),但是传统上只能用字符串当作键。这给它的使用带来了很大的限制。
为了解决这个问题,ES6提供了Map数据结构。它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。

exports.__esModule = true;
function mitt(all) {
	// 声明一个Map类型,作为整体事件处理中心
	all = all || new Map(); // Map类型是键值对的有序列表,而键和值都可以是任意类型
	return {
		all,
		on (type, handler) {
			// 先读取是否有对应事件的处理函数数组
			let handlers = all.get(type);
			if (handlers) {
				// 将新注册的函数推送到对应时间的函数数组中(发布一个事件,可以承载多个函数)
				handlers.push(handler);
			}
			else {
				// 创建一个对应 type 的函数数组
				all.set(type, [handler]);
			}
		},
		off (type, handler) {
			// 从map中取出所有的对应的函数数组
			let handlers = all.get(type);
			if (handlers) {
				// 如果存在hanlder,进行筛选后,从数组中删除。
				// 如果不存在直接清空当前事件所有的处理函数
				if (handler) {
					handlers.splice(handlers.indexOf(handler) >>> 0, 1);
				}
				else {
					all.set(type, []);
				}
			}
		},
		emit (type, evt) {
			let handlers = all.get(type);
			// 按照取出的函数数组遍历循环执行
			if (handlers) {
				handlers
					.slice()
					.map((handler) => {
						handler(evt);
					});
			}
			// 如果注册了 "\*" 的事件,执行它
			handlers = all.get('\*');
			if (handlers) {
				handlers
					.slice()
					.map((handler) => {
						handler(type, evt);
					});
			}
		}
	};
}
exports.default = mitt;


总结

秋招即将开始,校招的朋友普遍是缺少项目经历的,所以底层逻辑,基础知识要掌握好!

而一般的社招,更是神仙打架。特别强调,项目经历不可忽视;几乎简历上提到的项目都会被刨根问底,所以项目应用的技术要熟练,底层原理必须清楚。

这里给大家提供一份汇集各大厂面试高频核心考点前端学习资料。涵盖 HTML,CSS,JavaScript,HTTP,TCP协议,浏览器,Vue框架,算法等高频考点238道(含答案)

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

资料截图 :

高级前端工程师必备资料包

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue2中,兄弟组件之间传值有多种方法可以实现。其中一种方法是通过使用一个中间值的原型属性来实现数据的通信。在main.js中定义一个原型属性,可以作为中间值,在兄弟组件之间互相触发和接收来传递数据。具体步骤如下: 1. 首先,在main.js中定义一个Vue实例,并添加一个原型属性,作为中间值。例如,可以将中间值定义为data属性中的一个字段。 2. 在发送数据的组件中,通过触发一个自定义事件来传递数据。可以使用$emit方法触发事件,并将需要传递的数据作为参数传递给事件。 3. 在接收数据的组件中,可以通过绑定一个自定义事件来接收数据。可以使用$on方法监听事件,并在事件触发时执行回调函数来处理接收到的数据。 需要注意的是,在回调函数中使用箭头函数来确保this指向组件实例对象。否则,如果回调函数直接写在第二个参数处,this将不代表组件实例对象,而是undefined。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【Vue2】兄弟组件传参方法总结](https://blog.csdn.net/weixin_44431073/article/details/125027673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值