react当我们有两个完全不相关的组件想要通信时,就可以利用这种模式,其中一个组件负责订阅某个消息,而另一个元素则负责发送这个消息。使用Context配合

这篇具有很好参考价值的文章主要介绍了react当我们有两个完全不相关的组件想要通信时,就可以利用这种模式,其中一个组件负责订阅某个消息,而另一个元素则负责发送这个消息。使用Context配合。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在nextjs项目中,发现两个组件没啥关系,例如一个是一直存在的头部组件,另一个是页面中的组件,当我点击头部组件中的特定按钮时,把数据传递到页面组件中,页面组件接受到canshu数据后在做其他操作,那么他们两个如何通讯,通过context配合观察者模式实现。

  1. 首先在其共同的祖先组件中使用context
    下面的代码文件是根路由组件Layout.js
    其中children就是根据路由渲染的对应的页面
....
import {ConContext} from "../utils/test1";
import EventBus from "../utils/test";
const Layout = () => {
<ConContext.Provider value={EventBus()}>
      <Header />
        {children}
      <Footer></Footer>
      </ConContext.Provider> 

}
export default Layout

test1.js
创建context

import { createContext } from 'react';

export const ConContext = createContext(null);

test.js
使用 useEffect 包装下,否则会在服务端渲染,而服务端又没有浏览器对象,所以会报错,导致打包失败,下面代码中,注释的代码就会报找不到document,所以使用useEffect包装下创建了一个自定义hook勾子 useEvent,这个钩子创建一个变量用于接收EventBus这个类,为什么要在useEffect 创建EventBus呢,因为只有在useEffect中才能拿到浏览器对象,然后在返回变量。然后导出这个useEvent

"use client"
import {useEffect, useState} from 'react'
// 使用 useEffect 包装下,否则会在服务端渲染,而服务端又没有浏览器对象,所以会报错,导致打包失败
const useEvent = () => {
  const [val, setVal] = useState('')
  useEffect(() => {

    class EventBus {
      constructor() {
          this.bus = document.createElement('fakeelement');
      }

      addEventListener(event, callback) {
          this.bus.addEventListener(event, callback);
      }

      removeEventListener(event, callback) {
          this.bus.removeEventListener(event, callback);
      }

      dispatchEvent(event, detail = {}){
          this.bus.dispatchEvent(new CustomEvent(event, { detail }));
      }
    }
    setVal(new EventBus)
  },[])
  return val
}

export default useEvent


// "use client"
// class EventBus {
//   constructor() {
//       this.bus = document.createElement('fakeelement');
//   }

//   addEventListener(event, callback) {
//       this.bus.addEventListener(event, callback);
//   }

//   removeEventListener(event, callback) {
//       this.bus.removeEventListener(event, callback);
//   }

//   dispatchEvent(event, detail = {}){
//       this.bus.dispatchEvent(new CustomEvent(event, { detail }));
//   }
// }

// export default new EventBus
  1. 在header中触发事件,
    header.js
    使用useContext接收数据
import React, {useState, useContext} from 'react';
const Header = () => {
const EventBus = useContext(ConContext)
// 点击按钮时触发
  const clickTab = (url) => {
    setOpenMenu(false)
    // 点击头部菜单切换轮播图开始
    // EventBus.dispatchEvent('myEvent', {log: 2})
    // 点击头部菜单切换轮播图结束
    push(url)
  }
}
export default Header
  1. 在对应的页面组件中接收myEvent这个自定义事件

import React, { useEffect,useRef, useContext } from "react";
import { ConContext } from '../../utils/test1';
const Products = (props) => {
const EventBus = useContext(ConContext)
console.log(EventBus,'EventBus');
const slider = useRef();
const handleEvent = (e) => {
     slider.current.goTo(e.detail.log)
 }
useEffect(() => {
     EventBus.addEventListener('myEvent', handleEvent)
   }, [EventBus]);
}

export default Products;

参考:10种React组件之间通信的方法文章来源地址https://www.toymoban.com/news/detail-606635.html

到了这里,关于react当我们有两个完全不相关的组件想要通信时,就可以利用这种模式,其中一个组件负责订阅某个消息,而另一个元素则负责发送这个消息。使用Context配合的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • react父子组件通信

    父传子:最常见 把父组件中的数据传给子组件 子传父:子组件调用父组件传递过来的参数,并且把想要传递的数据当成函数的实参传入即可 【子组件通过调用父组件传递到子组件的方法向父组件传递数据】 对于子传父中子组件还是先调用了父组件传递过来的参数,之后再向

    2024年02月07日
    浏览(5)
  • React 组件通信-全面解析

    这段代码包括一个父组件 App 和一个子组件 Module ,实现了父子组件之间的通信。 在父组件 App 中,使用 useState 来定义了一个状态 defaultTodo ,并初始化为 defaultTodos 。 defaultTodos 是从 ./components/module/contentData 文件中导入的一个默认的待办事项列表。 App 组件中定义了两个回调函

    2024年02月15日
    浏览(5)
  • React组件之间通信

    1-1、安装 1-2、使用 A组件 B组件 1-3、总结

    2024年02月16日
    浏览(9)
  • React 组件通信方式

    人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得到最后的奖杯。 直接通过属性进行传递,数据的传递可以提高组件的复用性。 通过回调函数(callback)来实现。 ref 标记: 父组件拿到子组件的引用,从而调用子组件的方法

    2024年02月05日
    浏览(5)
  • React -- 组件通信

    React -- 组件通信

    A-B 父子通信 B-C 兄弟通信 A-E 跨层通信 **实现步骤 ** 父组件传递数据 - 在子组件标签上绑定属性 子组件接收数据 - 子组件通过props参数接收数据 props可以传递任意的合法数据 ,比如数字、字符串、布尔值、数组、对象、函数、JSX props是只读对象 子组件只能读取props中的数据,

    2024年02月19日
    浏览(10)
  • React中组件之间如何通信?

    React中组件之间如何通信?

    我们将组件间通信可以拆分为两个词: 组件 通信 回顾Vue系列的文章,组件是 vue 中最强大的功能之一,同样组件化是 React 的核心思想 相比 vue , React 的组件更加灵活和多样,按照不同的方式可以分成很多类型的组件 而通信指的是发送者通过某种媒体以某种格式来传递信息

    2024年02月04日
    浏览(4)
  • React中组件通信有哪些方式

    React中组件间的通信有一下几种情况:         父组件向子组件通信,可以通过props方式传递数据;也可以通过ref防暑传递数据;         子组件向父组件通信,通过回调函数方式传递数据;         父组件向后代所有组件传递数据,如果组件层级过多,通过props的方式传

    2024年02月14日
    浏览(5)
  • 前端react入门day03-react获取dom与组件通信

    前端react入门day03-react获取dom与组件通信

    (创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 受控表单绑定  React中获取DOM 组件通信 父传子  父传子-基础实现 父传子-props说明 父传子 - 特殊的prop children 子传父  使用状态提升实现兄弟组件通信 使用Context机制跨

    2024年02月01日
    浏览(8)
  • 【react从入门到精通】React父子组件通信方式详解(有示例)

    【react从入门到精通】React父子组件通信方式详解(有示例)

    【分享几个国内免费可用的ChatGPT镜像】 【10几个类ChatGPT国内AI大模型】 【用《文心一言》1分钟写一篇博客简直yyds】 【用讯飞星火大模型1分钟写一个精美的PPT】 在上一篇文章《JSX详解》中我们了解了什么是jsx以及jsx的语法规则。 本文中我们将详细了解React父子组件通信方式

    2024年02月05日
    浏览(42)
  • Vue3组件通信相关内容整理

    适用于:  父向子传递参数、方法, 子触发父传递的方法 props方式组件通信和vue2中的props传参类似,只是使用方式和接收方式有一些区别。 注意点: 通过props方式传递的参数为 只读属性,不可修改 父组件 子组件  组件A :绑定事件-接收数据  组件B:触发事件-传递数据 这

    2024年01月25日
    浏览(8)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包