react事件监听和触发(针对跨页面和跨级等等)

events.js文件

/*
 * @Descripttion: 
 * @version: 
 * @Author: sueRimn
 * @Date: 2021-08-30 14:40:39
 * @LastEditors: sueRimn
 * @LastEditTime: 2021-08-30 15:07:21
 */
function evtBus() {
  const listeners = {}; // 保存已经注册的事件
  const isFunction = (fn) => fn && Object.prototype.toString.call(fn) === '[object Function]';
  const isString = (str) =>
    str && (typeof str === 'string' || Object.prototype.toString.call(str) === '[object String]');
  const isValid = (event, callback) => isString(event) && isFunction(callback);

  return {
    on(event, callback) {
      // 校验合法性
      if (isValid(event, callback)) {
        // 已经注册过该事件的话,将callback加入到该事件的回调数组中
        if (listeners[event] && !listeners[event].includes(callback))
          listeners[event].push(callback);
        else listeners[event] = [callback];
      } else {
        console.error('$evtBus.on() 参数不合法');
      }
    },
    emit(event, params) {
      console.log(listeners[event],'listeners[event]')
      if (isString(event) && listeners[event])
        listeners[event].forEach((cb) => {
          cb(params);
        });
    },
    remove(event, callback) {
      if (isValid(event, callback) && listeners[event]) {
        const index = listeners[event].indexOf(callback);
        if (index !== -1) listeners[event].splice(index, 1);
      }
    },
  };
}

export default new evtBus();

挂载待react上

import Events from './utils/event_bus'
React.$Events = Events;

组件调用react事件总线api及例子

触发组件:

import React from 'react'

export default function test() {
  return (
    <button onClick={() => {
      React.$Events.emit('tap') // 触发总线事件
    }}>
      点击事件触发监控
    </button>
  )
}

其他页面监听事件:

import React, { useEffect } from 'react'

export default function test () {

  const cb = () => {
    console.log('总线事件触发')
  }

  useEffect(() => {
    React.$Events.on('tap', cb) // 绑定事件
    return () => {
      React.$Events.remove('tap') // 移除事件(可在任意地方移除)
    }
  }, [])

  return (
    <div>
      监听页面
    </div>
  )
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值