首页 > 其他 > 详细

vue----自己封装组件,非父子组件传值$on,$emit,$off

时间:2019-07-03 14:45:36      阅读:108      评论:0      收藏:0      [点我收藏+]
采用观察者模式
 
  $on   $off  $emit
 
     $on:绑定事件
绑定事件,一个事件名称上面可能绑定多个函数
$on("事件名称",回调函数)
事件名称与函数之间的关系:key:[]
  $emit:触发事件
触发事件时,需要触发当前事件身上所有的函数
$emit("事件名称",[需要传递的值])
  $off:解绑事件    
 
 $off("事件名称")  解绑全部函数
$off("事件名称",需要解绑的函数)
如果没有传递第二个参数,则解绑所有的事件对应的函数 如果传递了第二个参数,则解绑指定的函数
 

业务逻辑

 
$on:
1.首先判断当前事件名称是否存在, 如果事件名称存在,则直接将当前函数push到当前数组中去 如果事件名称不存在,则创建一个数组,再将当前函数push到数组中
$emit: 1.判断当前事件名称是否存在, 如果不存在,则什么都不干,直接return 如果存在,则获取当前事件名称所对应的所有函数,遍历执行 2.如果第二个参数存在,调用函数时,将第二个参数传递进去
$off: 1.首先判断当前事件名称是否存在 如果不存在,直接return 如果存在,则判断第二个参数是否存在 如果存在,则将这个函数从数组中移除 如果不存在,则直接将数组清空
 

代码实现observer.js

 
let EventList = {
  //事件名称与事件函数的关系key:[] //key:[] } const $on = (EventName,cb)=>{   //判断事件名称是否存在 if(!(EventList[EventName])){     //事件名称不存在,则创建数组 EventList[EventName] = []; }
  //将事件名称对应的函数push到数组中 EventList[EventName].push(cb); } const $emit = (EeventName,params)=>{
  //判断事件名称是否存在,不存在,直接return if(!EventList[EeventName])return;   //事件名称存在,获取当前事件名称对应的所有函数,遍历执行 let EventLists = EventList[EeventName];
  //遍历事件名称所对应的函数 EventLists.map((cb)=>{
    //判断是否传值,执行对应的函数 params?cb(params):cb(); }) } const $off = (EventName,callback)=>{
  //判断事件名称是否存在,若存在 if(EventList[EventName]){ let EventListsOff = EventList[EventName];
    //判断第二个参数是否存在,如果存在 if(callback){
        //将其从数组中移除 EventList[EventName] = EventListsOff.filter((cb)=>{ return cb != callback; }) }else{
        //第二个参数不存在,直接将数组清空 EventList[EventName].length = 0; } } } export default { $on, $emit, $off }

 

vue----自己封装组件,非父子组件传值$on,$emit,$off

原文:https://www.cnblogs.com/a1411305006/p/11125850.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!