当前位置: 首页 > news >正文

【React】关于组件之间的通讯

🌟组件化:把一个项目拆成一个一个的组件,为了便与开发与维护
组件之间互相独立且封闭,一般而言,每个组件只能使用自己的数据(组件状态私有)。
如果组件之间相互传参怎么办? 那么就要考虑组件之间的通讯。

props基本使用

props能够实现传递数据和接受数据

作用:接收其他组件传递的数据

传递:给组件标签添加属性,就表示给组件传递数据

接收:分为函数组件和类组件

  • 函数组件:通过参数props
  • 类组件:通过this.props

函数式组件使用props

// 函数组件通过props获取
function Hi(props) {return <div>{props.name}</div>
}...
...
const VNode = (<div><Hi name={'Tricia'}></Hi></div>
)

类组件使用this.props

// class 组件需要通过 this.props 来获取
class Hello extends Component {render() {return <div>接收到的数据:{this.props.age}</div>}
}
...
...
const VNode = (<div><Hello name="jack" age={19} /></div>
)

在这里插入图片描述

注意点:

  1. props只能读取对象中的属性,但是无法修改。
  2. 单向数据流: 数据从父组件流向子组件,即父组件的数据修改时,子组件也跟着修改
  3. 子组件的数据不能传递给父组件
  4. 🌟传递字符串时可以直接传递,传递其他数据类型时需要加 {}

组件通讯

父传子

将父组件的数据传递给子组件,数据是单向流,子组件中是只读的!

步骤:

  1. 父组件提供要传递的state数据
  2. 给子组件标签添加属性,值为state中的数据
  3. 子组件中通过props接收父组件传递过来的数据
  • 父组件
// 定义一个父组件
class Father extends React.Component {// 父组件在state中提供数据state = {fName: '朗道',}render() {return (<><div><p>father</p>{/* 父组件数据通过子组件标签传递给子组件 */}<Son fName={this.state.fName}></Son></div></>)}
}
  • 子组件中通过 this.props.属性名 接收父组件中传递的数据

    import { Component } from 'react'
    class Son extends Component {render() {return (<>{/* 子组件通过this.props接收父组件传过来的数据并渲染 */}<p>Son : {this.props.fName}</p></>)}
    }
    export default Son
    

注意:

父传子也可以在内容里面传,用JSX。子组件接受时使用 this.props.children

import React, { Component } from 'react'
import ReactDom from 'react-dom'class AppSon extends Component {render() {console.log(this.props)return (<><h2>我是App的儿子</h2><div>{this.props.name}{this.props.age}{/* 用children来接受 */}{this.props.children}</div></>)}
}
class App extends Component {render() {return (<><h1>我是App</h1><AppSon name={'停云'} age={18098}>{/* 父传子也可以在此处传递 */}{<p>hi,我是内容</p>}</AppSon></>)}
}
ReactDom.createRoot(document.querySelector('#root')).render(<App></App>)

在这里插入图片描述

子传父

步骤

  1. 父组件提供一个回调函数,将该函数作为属性的值,传递给子组件。
  2. 子组件通过props调用回调函数
  3. 将子组件的数据作为参数传递给回调函数。
import React, { Component } from 'react'
import ReactDom from 'react-dom/client'// 子传父本质是父组件传递给子组件一个方法,子组件通过调这个方法来向父组件传参。
class AppSon extends Component {render() {return (<><h2>我是App的儿子</h2><span>{this.props.name}</span><button onClick={() => this.props.editName(this.props.name)}>点击执行父组件的方法</button></>)}
}
class App extends Component {state = {name: '冷面小青龙',}editName = (val) => {console.log(val)this.setState({name: val === '丹恒' ? '冷面小青龙' : '丹恒',})}render() {return (<><h1>我是App</h1><AppSon name={this.state.name} editName={this.editName}></AppSon></>)}
}
ReactDom.createRoot(document.querySelector('#root')).render(<App></App>)

注意

回调函数不能用普通函数,因为this指向的问题,如果是普通函数那么谁调用this就指向谁。这个函数是被this.props调用的,所以this指向的是父组件传递过去的参数

class App extends Component {state = {name: '冷面小青龙',}editName() {// 错误写法// 注意⚠️:这里不能用普通函数,因为this指向的问题,如果是普通函数那么谁调用this就指向谁。这个函数是被this.props调用的,所以this指向的是父组件传递过去的参数console.log(this)} render() {return (<><h1>我是App</h1><AppSon name={this.state.name} editName={this.editName}></AppSon></>)}
}

兄弟组件通讯(状态提升)

核心思想:状态提升

公共父组件职责:

  1. 提供共享状态
  2. 提供操作共享状态的方法

要互相通讯的两个子组件只需通过props接受或者操作状态。说白了就是。父传子 + 子传父

步骤:

在这里插入图片描述

  1. Son1通过子传父,将自己要传递的state给公共父组件
  2. Son2通过父传子得到这个state
import React, { Component } from 'react'
import ReactDOM from 'react-dom/client'
import Son1 from './Son1'
import Son2 from './Son2'
export default class App extends Component {state = {num: '123',}editNum = (n) => {this.setState({num: +this.state.num + n,})}render() {return (<><div>App</div>{/* 通过子传父改变num值 */}<Son1 editNum={this.editNum}></Son1>{/* 父传子得到Son1的num 值 */}<Son2 num={this.state.num}></Son2></>)}
}
ReactDOM.createRoot(document.querySelector('#root')).render(<App></App>)

跨级组件通讯 - context

context: 上下文,可以理解为是一个范围,在这个范围内的所有组件都可以跨级通讯。

步骤

  1. 引入createContext方法,拿到Provider和Consumer
  2. 将createContext方法提出来,提供Provider, Consumer这两个组件并导出
  3. 使用Provider组件包裹整个应用,通过value属性提供要共享的数据。
  4. 通过Consumer组件接收共享的数据

在这里插入图片描述

  • context.jsx

    // 公共组件:提供Provider, Consumer这两个组件// 1. 导入createcontext方法
    import { createContext } from 'react'
    // 2. 调用方法得到两个组件 Provider, Consumer
    const Context = createContext()
    export default Context
    
  • index.js

    • 提供共享的数据和方法
    • 如果要修改状态,也是将方法写在value中,最后由需要组件去调用。
    import React, { Component } from 'react'
    import ReactDOM from 'react-dom/client'
    import GrandPa from './GrandPa'import Context from './Context/context'
    const { Provider } = Contextexport default class App extends Component {state = {num: '云浮将军景元元',age: 109776,}render() {return (// 使用Provider组件包裹根组件,并要提供value// 若要提供多个属性,可以写成对象格式<Provider value={{ name: this.state.num, age: this.state.age }}><div><h1>App</h1><GrandPa></GrandPa></div></Provider>)}
    }ReactDOM.createRoot(document.querySelector('#root')).render(<App></App>)
    
  • 在任意一个组件中均可使用共享的数据,例如Father.jsx

    import React, { Component } from 'react'
    import Son from './Son'
    import Context from './Context/context'
    const { Consumer } = Context
    export default class Father extends Component {render() {return (<Consumer>{/* 接收state  需要将DOM放入插值中,并用箭头函数返回 */}{(obj) => (<div style={{ border: '2px solid #333', margin: '10px' }}>Father -- {obj.name}<Son></Son></div>)}</Consumer>)}
    }
    
  • 在Son.jsx组件中去修改状态

import React, { Component } from 'react'
import Context from './Context/context'
const { Consumer } = Context
export default class Son extends Component {render() {return (<Consumer>{(obj) => (<div style={{ border: '2px solid #333', margin: '10px' }}>Son -- {obj.age}<button onClick={() => obj.editAge(5)}>增加➕</button></div>)}</Consumer>)}
}

在这里插入图片描述

相关文章:

【React】关于组件之间的通讯

&#x1f31f;组件化&#xff1a;把一个项目拆成一个一个的组件&#xff0c;为了便与开发与维护 组件之间互相独立且封闭&#xff0c;一般而言&#xff0c;每个组件只能使用自己的数据&#xff08;组件状态私有&#xff09;。 如果组件之间相互传参怎么办&#xff1f; 那么就要…...

item_get-小红薯-商品详情

一、接口参数说明&#xff1a; smallredbook.item_get&#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/smallredbook/item_get 名称类型必须描述keyString是调用key&#xff08;http://o0…...

网络安全进阶学习第十课——MySQL手工注入

文章目录 一、MYSQL数据库常用函数二、MYSQL默认的4个系统数据库以及重点库和表三、判断数据库类型四、联合查询注入1、具体步骤&#xff08;靶场演示&#xff09;&#xff1a;1&#xff09;首先判断注入点2&#xff09;判断是数字型还是字符型3&#xff09;要判断注入点的列数…...

2.3 网络安全协议

数据参考&#xff1a;CISP官方 目录 OSI七层模型TCP/IP体系架构TCP/IP安全架构 一、OSI七层模型 简介 开放系统互连模型&#xff08;Open System Interconnection Reference Model&#xff0c;OSI&#xff09;是国际标准化组织&#xff08;ISO&#xff09;于1977年发布的…...

Apache Flink概述

Flink 是构建在数据流之上的一款有状态的流计算框架&#xff0c;通常被人们称为第三代大数据分析方案 第一代大数据处理方案&#xff1a;基于Hadoop的MapReduce 静态批处理 | Storm 实时流计算 &#xff0c;两套独立的计算引擎&#xff0c;难度大&#xff08;2014年9月&#x…...

django使用mysql数据库

Django开 发操作数据库比使用pymysql操作更简单&#xff0c;内部提供了ORM框架。 下面是pymysql 和orm操作数据库的示意图&#xff0c;pymysql就是mysql的驱动&#xff0c;代码直接操作pymysql ,需要自己写增删改查的语句 django 就是也可以使用pymysql、mysqlclient作为驱动&a…...

MongoDB文档--基本概念

阿丹&#xff1a; 不断拓展自己的技术栈&#xff0c;不断学习新技术。 基本概念 MongoDB中文手册|官方文档中文版 - MongoDB-CN-Manual mongdb是文档数据库 MongoDB中的记录是一个文档&#xff0c;它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包…...

【TypeScript】TS入门及基础学习(一)

【TypeScript】TS入门及基础学习&#xff08;一&#xff09; 【TypeScript】TS入门及基础学习&#xff08;一&#xff09;一、前言二、基本概念1.强类型语言和弱类型语言2.动态语言和静态语言 三、TypeScript与JavaScript的区别四、环境搭建及演练准备4.1 安装到本地4.2 在线运…...

Dockerfile构建LNMP镜像(yum方式)

目录 Dockerfile构建LNMP镜像 1、建立工作目录 2、编写Dockerfile文件 3、构建镜像 4、测试容器 5、浏览器访问测试&#xff1a; Dockerfile构建LNMP镜像 1、建立工作目录 [roothuyang1 ~]# mkdir lnmp/ [roothuyang1 ~]# cd lnmp/ 2、编写Dockerfile文件 [roothuyang1 …...

Flink Windows(窗口)详解

Windows&#xff08;窗口&#xff09; Windows是流计算的核心。Windows将流分成有限大小的“buckets”&#xff0c;我们可以在其上应用聚合计算&#xff08;ProcessWindowFunction&#xff0c;ReduceFunction&#xff0c;AggregateFunction或FoldFunction&#xff09;等。在Fl…...

AssetBundle学习

官方文档&#xff1a;AssetBundle 工作流程 - Unity 手册 (unity3d.com) 之前写的博客&#xff1a;AssetBundle学习_zaizai1007的博客-CSDN博客 使用流程图&#xff1a; 1&#xff0c;指定资源的AssetBundle属性 &#xff08;xxxa/xxx&#xff09;这里xxxa会生成目录&…...

CompletableFuture原理与实践

文章目录 1 为何需要并行加载2 并行加载的实现方式2.1 同步模型2.2 NIO异步模型2.3 为什么会选择CompletableFuture&#xff1f; 3 CompletableFuture使用与原理3.1 CompletableFuture的背景和定义3.1.1 CompletableFuture解决的问题3.1.2 CompletableFuture的定义 3.2 Complet…...

8.3 作业

整理思维导图 2. 递归实现&#xff0c;输入一个数&#xff0c;输出这个数的每一位 #include <myhead.h> void fun(int t) {if(t 0) return;fun(t/10);printf("%d\n",t%10); } int main(int argc,const char *argv[]) {int t1623809; fun(t);return 0; } 3.递…...

c# COM组件原理

COM&#xff08;Component Object Model&#xff09;是一种微软的软件组件技术&#xff0c;用于实现软件组件之间的互操作性。它是一种二进制接口标准&#xff0c;允许不同的软件组件在不同的进程中进行通信。COM组件可以用多种编程语言编写&#xff0c;并且可以在多个应用程序…...

Java POI 百万规模数据的导入和导出

目录 1、百万数据导入1.1 需求分析1.2 思路分析1.3 代码实现1.3.1 步骤分析1.3.2 自定义处理器1.3.3 自定义解析1.3.4 测试 2、百万数据导出2.1、概述2.2、解决方案分析2.3、原理分析2.4、百万数据的导出2.4.1、模拟数据2.4.2、思路分析2.4.3、代码实现2.4.4、测试结果 1、百万…...

如何快速用PHP取短信验证码

要用PHP获取短信验证码&#xff0c;通常需要连接到一个短信服务提供商的API&#xff0c;并通过该API发送请求来获取验证码。由于不同的短信服务提供商可能具有不同的API和授权方式&#xff0c;我将以一个简单的示例介绍如何使用Go语言来获取短信验证码。 在这个示例中&#xff…...

CloudStack 的 AsyncJobManagerImpl

在 CloudStack 的 AsyncJobManagerImpl 类中&#xff0c;下列方法的作用如下&#xff1a; getConfigComponentName(): 返回配置组件的名称。 getConfigKeys(): 返回与异步任务管理器相关的配置键列表。 getAsyncJob(): 根据异步任务的 ID 获取相应的异步任务对象。 findInst…...

OAuth机制_web站点接入微软azure账号进行三方登录

文章目录 ⭐前言⭐微软三方登录流程&#x1f496; web站点获取微软账号流程&#x1f496; node封装微软登录接口&#x1f496; webapp 自定义code换token&#x1f496; 调用 Microsoft Graph API&#x1f496; 前端唤醒authlink进行登录回调逻辑 ⭐结束 ⭐前言 大家好&#xf…...

Linux ALSA音频工具aplay、arecord、amixer的使用方法

ALSA 是Advanced Linux Sound Architecture的缩写&#xff0c;先进的Linux音频架构&#xff0c;为Linux操作系统提供音频和MIDI功能。 aplay命令 aplay是播放命令。 rootimx6ul7d:~# aplay -h Usage: aplay [OPTION]... [FILE]...-h, --help help--version …...

编写一个最简单的Linux服务端和客户端程序

2023年8月3日&#xff0c;周四下午 这篇文章我从下午开始写了几个小时&#xff0c; 这篇文件基本总结了我今天学到的知识&#xff0c; 在写这篇文章的过程中灵感不断涌现、想明白了很多知识点&#xff0c;非常酣畅淋漓。 什么叫做深度学习&#xff1f;这就是深度学习&#…...

OFDM自适应调制的“智能”从哪来?深入聊聊信道状态信息(CSI)的获取与反馈那些坑

OFDM自适应调制背后的工程智慧&#xff1a;信道状态信息实战指南 在无线通信系统的设计与优化中&#xff0c;OFDM自适应调制技术如同一位隐形的调音师&#xff0c;实时调整着每个子载波的"音调"&#xff08;调制方式&#xff09;以适应瞬息万变的信道环境。但这位调音…...

【Causality】从数据到因果图:算法如何发现隐藏的关联

1. 因果发现&#xff1a;从数据中挖掘隐藏的真相 想象一下你是一名医生&#xff0c;面对一群患有相同症状的病人。通过观察他们的病历数据&#xff0c;你发现喝咖啡的人往往血压更高。这是否意味着咖啡会导致高血压&#xff1f;还是说喝咖啡的人往往工作压力更大&#xff0c;而…...

微软这个开源语音 AI 火了:GitHub 星标逼近 4 万,为什么大家都在讨论它?

聊天机器人这边还没卷明白&#xff0c;微软又把语音 AI 推上了热榜。这次火起来的项目&#xff0c;叫 VibeVoice。 它不是一个单点模型&#xff0c;而是一整套开源语音 AI 方案。GitHub 仓库当前星标已经逼近 4 万&#xff0c;确实是最近开源圈里最受关注的项目之一。更重要的是…...

图像滤波实战:用MATLAB玩转频域,5分钟学会低通/高通滤波(附完整代码)

图像滤波实战&#xff1a;用MATLAB玩转频域&#xff0c;5分钟学会低通/高通滤波&#xff08;附完整代码&#xff09; 当你面对一张需要去噪或锐化的图片时&#xff0c;频域处理技术能像魔法一样帮你实现这些效果。不同于传统空间域的像素级操作&#xff0c;频域处理让我们能够直…...

Linux配置SSH密钥实现安全免密服务器登录

SSH的诞生&#xff1a;为Linux交互安全而生 它是一个加密的网络传输协议&#xff0c;旨在提供一个安全的方式来远程登录和执行命令&#xff0c;除了现在我们使用密码登录外还可用配置ssh密钥登录&#xff0c;好比现在智能门锁&#xff0c;默认输入密码就可以开锁&#xff0c;但…...

生成式AI实时通信的“隐形瓶颈”:模型Tokenizer流式切分与网络MTU错配问题(附Wireshark抓包取证全过程)

第一章&#xff1a;生成式AI应用实时通信方案 2026奇点智能技术大会(https://ml-summit.org) 生成式AI应用对低延迟、高并发、上下文感知的实时通信能力提出全新要求。传统REST API轮询或短连接模式难以支撑流式推理响应、多模态协同编辑、Agent间动态协商等典型场景。现代架构…...

别再用老教程了!手把手教你用Proteus 8.13和8086+8255搭建一个真能用的投票器(附完整汇编源码)

从零构建80868255投票器&#xff1a;Proteus 8.13实战避坑指南 在微机原理实验课上&#xff0c;最令人沮丧的莫过于按照网络教程一步步操作&#xff0c;最后却发现电路根本无法运行。特别是当使用老旧的Proteus版本教程搭配新版软件时&#xff0c;各种兼容性问题会让初学者寸步…...

健康管理没有局外人!深圳国商联帮你把健康握在手里

不知道你有没有发现&#xff0c;身边谈论“养生”的人越来越年轻了。 以前觉得三高、心血管问题那是上了年纪才要考虑的事&#xff0c;现在三十出头就开始关注血脂、血糖的朋友大有人在。至于癌症&#xff0c;更是不分年龄、不分性别&#xff0c;悄悄潜伏在生活角落里。 说白了…...

如何从SQL获取当前登录用户数据_使用系统上下文函数

...

新鲜出炉!Claude Code之父亲授 Opus 4.7 最佳实践

Boris Cherny的opus 4.7最佳实践&#xff0c;教你如何利用重新校准的投入度级别、自适应思考功能以及全新的默认设置&#xff0c;全面优化你的代码工作流&#xff0c;快速适应opus 4.7这个模型。 Anthropic最新发布Opus 4.7。官方给出的定位是&#xff1a;目前正式上线的最强模…...