Vue中组件传值$on和$emit的编写

这是关于实现$on和$emit以及$off的js文件

因为每次实现这些方法都要实例vue,这使一些vue不需要的功能也一起带进来了,不利于优化。

let callbackMap = {};

export default {
    // 添加事件监听
    $on: function(eventName, callback){
        // 按名字保存所有的回调函数

        //1.判断callbackMap是否保存过相同的事件
        if(!callbackMap[eventName]){
            callbackMap[eventName] = [];//没有,就设置一个保存的容器
        }

        // 2.将callback放在容器中
        callbackMap[eventName].push(callback);

        // console.log(callbackMap);
    },
    // 触发事件
    $emit: function(eventName, ...rest){
        // 按名字调用保存的所有的回调函数
        // 1.按照名字取出所有的回调
        let callbackArr = callbackMap[eventName];
        if(!callbackArr){
            return;//没有监听的回调
        }
        // 2.一个一个调用回调,并且传参
        callbackArr.map(callbackItem=>{
            callbackItem(...rest);
        })

    },
    // 移除事件
    $off: function(eventName, callback){
        if(!eventName){
            //移除所有事件监听
            callbackMap = {};
            return;
        }
        if(eventName && (!callback)){
            //移除指定事件的所有监听
            callbackMap[eventName] = [];
        }
        if(eventName && callback){
            //移除指定事件的指定的某一个监听
            //获得所有的回调
            let callbackArr = callbackMap[eventName];
            // 从数组中删除对应的需要移除的事件
            callbackMap[eventName] = callbackArr.filter(callbackItem=>{
                return callbackItem != callback;
            })
        }
    

    }

 

这个可以建立一个js文件,然后引入

import center from './center.js'

然后在Vue.prototype.$center = center;即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值