首页 > 其他分享 >React 组件通信方式

React 组件通信方式

时间:2023-12-06 16:12:02浏览次数:27  
标签:订阅 通信 React callback context 组件 EventBus

人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得到最后的奖杯。

1. 父子组件通信方式

1.1 父组件传递到子组件

直接通过属性进行传递,数据的传递可以提高组件的复用性。

1.2 子组件传递到父组件

  • 通过回调函数(callback)来实现。

  • ref 标记:父组件拿到子组件的引用,从而调用子组件的方法和访问子组件的状态。

2. 非父子组件通信方式

2.1 状态提升(中间人模式)

React 中的状态提升概括来说,就是将多个组件需要共享的状态提升到它们最近的父组件上。在父组件上改变这个状态然后通过 props 分发给子组件。本质上也是通过父子通信来实现。

应用场景:兄弟组件之间通信方式。不至于很复杂。

2.2 发布订阅模式

发布订阅模式思想:调度中心有一个订阅者集合,订阅者往调度中心注册订阅(一个回调方法),发布者调用调度中心提供的发布方法即可发布,发布方法中依次调用订阅者注入的回调。

10. 订阅发布模式

// 调度中心
var EventBus = {
  // 订阅者集合
  subscribeList: [],

  // 订阅
  subscribe(callback) {
    this.subscribeList.push(callback)
  },

  // 发布
  publish(context) {
    this.subscribeList.map(callback=>{
      callback && callback(context)
    })
  }
}

// 订阅者
EventBus.subscribe((context)=>{
  console.log("订阅者1收到:", context)
})

EventBus.subscribe((context)=>{
  console.log("订阅者2收到:", context)
})

// 发布者
EventBus.publish("男人看了沉默...")

2.3 context 状态树传参

思想:React 官方提供的解决方法,采用生产者消费者这种模式。

哪些子组件需要通信,在他们共有的父组件身上包装一个 Provider (供应商)组件,供应商组件是通过 React.createContext 方法创建出来的。 成为供应商组件,得提供服务。消费者享受服务。如果一个消费者改变服务,另一个消费者受到影响。

定义全局 context 对象:

const GlobalContext = React.createContext()
export default GlobalContext

定义供应商组件 Provide(生产者):

export default class App extends Component {
  render() {
    return (
      <div>
        <GlobalContext.Provider value={
          {
            name: "hubert",
            change: ()=>{ 
              // 通过状态修改更新 
            }
          }
        }>
        {/* 组件内容 */}
        </GlobalContext.Provider>
      </div>
    )
  }
}

定义消费者组件 Consumer(消费者):

class Customer extends Component {
  render() {
    return (
      <GlobalContext.Customer>
        {
          (value)=>{
            {/* 这里 value 值就是提供的服务 */}
          }
        }
      </GlobalContext.Customer>
    )
  }
}

标签:订阅,通信,React,callback,context,组件,EventBus
From: https://www.cnblogs.com/hubert-style/p/17879764.html

相关文章

  • dom断点可定位react组件值修改
    react组件的值修改,也可以使用dom断点来定位。之前一直误区,认为react组件的修改,不能用dom断点来拦截,实际上在涉及到修改具体原生组件属性的时候,也可定位。例如:react组件内部使用了input组件,react组件值变化导致input的value发生改变,使用dom断点就可定位。由于input组件的属性修......
  • Vue使用el-cascader实现地区选择器组件
    1.使用组件-效果展示(推荐)1.2安装组件依赖(默认是V6版本,旧版本V5.02)官方文档地址(二级联动,三级联动包含教程):https://www.npmjs.com/package/element-china-area-datanpminstallelement-china-area-data-Snpminstallelement-china-area-data@5.0.2-S1.3V6版本使用注......
  • svg+css实现带灰色背景的loading加载动画组件
    <template><svgclass="load"viewBox="25255050":style="{width:loadWidth,height:loadWidth}"><circleclass="loading_bg"cx="50"cy="50"r="20"......
  • 核电堆芯组件动态特性试验研究
    u  核电试验概述反应堆是核电事业的核心组成部分之一,堆内构件、堆芯燃料组件等部件在冷却剂流动冲击下,会诱发剧烈振动,导致堆芯内试验件流道不稳定。为了保障反应堆的安全运行,根据国家核安全法规规定,有必要对受冷却剂冲击的堆内构件进行振动特性试验,用于判断系统和零部件在一定流......
  • 基于Vue3.3 + TS4 ,让我们自主打造比肩 ElementPlus 的优质组件库的一些经验总结
    Vue.js作为一款流行的JavaScript框架,在前端开发中扮演着重要的角色。本文将分享在Vue3.3和TypeScript4的环境下,打造优质组件库的经验总结,并提供相关示例代码。一、创建项目并配置开发环境首先,我们需要创建一个新的Vue项目并配置好开发环境。具体步骤如下:使用VueCLI创建一个新的......
  • Vue3的手脚架使用和组件父子间通信-插槽(Options API)学习笔记
    VueCLI安装和使用全局安装最新vue3npminstall@vue/cli-g升级VueCLI:如果是比较旧的版本,可以通过下面命令来升级npmupdate@vue/cli-g通过脚手架创建项目vuecreate01_product_demoVue3父子组件的通信父传子父组件<template><div><divclass="item"v-for="(item,in......
  • DevExpress WinForms Pivot Grid组件,一个类似Excel的数据透视表控件(一)
    界面控件DevExpressWinForms的PivotGrid组件是一个类似Excel的数据透视表控件,用于多维(OLAP)数据分析和跨选项卡报表。众多的布局自定义选项使您可以完全控制其UI,无与伦比的以用户为中心的功能使其易于部署。DevExpressWinForms有180+组件和UI库,能为WindowsForms平台创建具有......
  • 32-SPI通信
    软件模拟的SPI和硬件实现SPI(SPI外设)SPI(串行外设接口)协议四根通信线:SCK(串行时钟线) MOSI(Masteroutputslaveinput)主机输出从机输入    MISO(主机输入从机输出)    SS(从机选择)有时也叫CS      MOSI和MISO有时也叫DO和DI同步,全双工 主机的波特率......
  • 浏览器跨 Tab 窗口通信原理
    目录浏览器跨Tab窗口通信原理BroadcastChannelSharedWorkerAPIlocalStorage/sessionStorage跨Tab窗口通信应用场景浏览器跨Tab窗口通信原理所谓多窗口下进行互相通信,是指在浏览器中,不同窗口(包括不同标签页、不同浏览器窗口甚至不同浏览器实例)之间进行数据传输和通信的......
  • 网络通信、UDP通信、TCP通信、BS架构模拟、URL了解
    网络编程可以让程序与网络上的其他设备中的程序进行数据交互所以,我们学习网络编程的主要目的就是为了实现网络通信网络通信网络通信基本模式常见的通信模式有如下2种形式:Client-Server(Cs)、Browser/Server(Bs)Client-Server(Cs)主要是客户端与服务端之间的联系(就是相应的App和后......