2022-07-15 工作记录--JS-实现所有组件间的通信

JS-实现所有组件间的通信

通过JS里的方法实现所有组件间的通信,下面以react为例🌰,如下:👇🏻

  • 实现效果:点击无库存弹窗noInventoryPopover里的「再抽一次」按钮,实现首页homePage里的转盘抽奖。

第一步、发送事件

当你🥕想把某个方法抛出去时,发送事件,并取唯一的事件名【要在组件的componentWillUnmount中移除事件】:见代码里的【1】【2】 👇🏻

  • 通过document.addEventListener("自定义事件名", 方法, this); 发送事件 ⭐️
    • 举例 ✍🏻:发送事件 —— 名为"drawPrize",方法为 this.clickStart
      • document.addEventListener("drawPrize", this.clickStart, this);
        请添加图片描述
  • 通过document.removeEventListener("自定义事件名", 方法, this); 移除事件 ⭐️
    • 举例 ✍🏻:移除事件 —— 名为"drawPrize",方法为 this.clickStart
      • document.removeEventListener("drawPrize", this.clickStart, this);
        请添加图片描述

首页homePage.jsx

'use strict';

import React,{Component} from 'react';


class HomePage extends Component {

  componentDidMount() {
    document.addEventListener("drawPrize", this.clickStart, this); // 【1】发送事件"drawPrize"——抽奖
  }

  componentWillUnmount() {
    document.removeEventListener("drawPrize", this.clickStart, this); // 【2】移除事件
  }

  // 开始抽奖
  clickStart = (e) => {
  	console.log('开始抽奖咯~');
  	const { param } = e.detail;
	console.log('获取到传递的参数: ',param); // 获取到传递的参数: 我是需要传递的参数param
  }

  render() {
    return (
      <div className="homePage"></div>
    );
  }
}

export default HomePage;

第二步、接收事件

当你🥕想接收到上面抛出的事件并调用其方法 / 传递参数时:见代码里的【3】 👇🏻

  • 通过document.dispatchEvent(new CustomEvent("对应事件名", {detail: 参数对象})); 接收事件 ⭐️
    • 【不传递参数】 举例 ✍🏻:接收事件 —— 名为"drawPrize",调用的方法为 this.clickStart
      • document.dispatchEvent(new CustomEvent("drawPrize", {}));
    • 【传递参数】 举例 ✍🏻:接收事件 —— 名为"drawPrize",调用的方法为 this.clickStart,并向该方法传递参数param
      • document.dispatchEvent(new CustomEvent("drawPrize", {detail: {param: '我是需要传递的参数param'}}));
        请添加图片描述

无库存弹窗noInventoryPopover.jsx

import React,{Component} from 'react';

class NoInventoryPopover extends Component {

  // 点击「再抽一次」
  tryAgain = () => {
    // 若有抽奖次数,点击后触发抽奖;若无抽奖次数,toast“抽奖次数不足,完成任务获得更多~”
    const { gameCount } = store?.treasureInfo || {}; // gameCount:游戏次数
    console.log('游戏次数: ',gameCount);
    if(gameCount>0) { // 抽奖次数充足
      modalStore.closePop('NoInventoryPopover'); // 关闭弹窗
      /** 【3】接收事件 */
      document.dispatchEvent(new CustomEvent("drawPrize", {detail: {param: '我是需要传递的参数param'}}));
    } else { // 抽奖次数不足
      Toast('抽奖次数不足,完成任务获得更多~');
    }
  }


  render() {
    return (
      <div className="noInventoryPopover">
        {/* 按钮-再抽一次 */}
        <span className="button" onClick={this.tryAgain}></span>
      </div>
    );
  }
}
export default NoInventoryPopover;

请添加图片描述

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小呀小萝卜儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值