React——组件通讯(不完整版)

组件通讯介绍

组件中的状态是私有的,组件的状态只能在组件内部使用,无法直接在组件外使用,但是我们在日常开发中,通常会把相似、功能完整的应用才分成组件(工厂模式)利于我们的开发,而不同组件直接又需要传递数据,而这个过程就是组件通讯。

组件通讯-父子间、兄弟间传值props

props,学过vue的其实我们都很熟悉,都是父组件传递给子组件的一种方式。

props 是只读对象,只能读取属性,无法修改,属于单向数据流。

根本作用:接收(其他组件)传递给当前组件的数据

如何传递

// 传递数据:给组件标签添加属性 用{}内部传入数据,数据类型依据输入决定
<New userName='hyy' id={'1233414'} />

函数组件接受,参数props直接接受

// 接收数据(函数组件):
// props :{ userName='hyy' id={'1233414'} }
function getProps(props) {
  return (
    <div>
      <div>{props.userName}</div>
      <div>{props.id}</div>
      </div>
  )
}

Class组件接受,this.props接受

// 接收数据(类组件):
// this.props :{ userName='hyy' id={'1233414'} }
class New extends Component {
  render() {
    return (
        <div>
      <div>{this.props.userName}</div>
      <div>{this.props.id}</div>
        </div>
    ) 
  }
}
组件通讯-父传子 props 代码示例
// 父组件传值
class Parent extends React.Component {
    state = { userName: 'hyy' }
    render() {
        return (
            <div>
               <Child userName={this.state.userName} />
            </div>
        )
    }
}
// 子组件获取 函数组件
function Child(props) {
	return <div>{props.userName}</div>
}
// 子组件获取 类组件
class Child extends React.Component {
    render(){
        return <div>{this.props.userName}</div>
    }
}
组件通讯-子传父 props 代码示例

跟vue很像,通过props传递回调函数给子组件,子组件调用函数传递参数给父组件

// 声明一个回调函数,传递给子组件
class Parent extends React.Component {
    getChildData = (data) => {
        console.log('子组件数据传递的数据', data)
    }
    render() {
        return (
            <div>
            	<Child getData={this.getChildData} />
            </div>
        )
    }
}
// 子组件调用函数,通过传递参数传递给父组件
class Child extends React.Component {
    state = { childData: '子传父 props' }
    handleClick = () => {
    	this.props.getData(this.state.childData)
    }
    return (
    	<button onClick={this.handleClick}>传递数据给父元素</button>
    )
}
组件通讯-兄弟组件 props 代码示例

状态提升:将共享状态提升到最近的公共父组件中,由公共父组件管理这个状态

核心内容:把共同的父组件当中eventBus的数据处理中心

import React, { Component } from 'react'
import ReactDOM from 'react-dom'
import Bor1 from './bor1'
import Bor2 from './bor2'
// 父组件
class App extends Component {
  state = {
    borData: '',
  }
  render() {
     // 给兄弟1传递改变方法,给兄弟2传递被改变的值
    return (
      <div
        <Bor1 change={this.changebor2Data}>兄弟组件1</Bor1> 
        <Bor2 borData={this.state.borData}>兄弟组件2</Bor2>
      </div>
    )
  }
  // 兄弟1传递给兄弟2 borData的修改方法
  changebor2Data = (borData) => {
    this.setState({
      borData,
    })
  }
}
ReactDOM.render(<App />, document.getElementById('root'))
// 兄弟组件1
import React, { Component } from 'react'

export default class Bor1 extends Component {
  render() {
    return (
      <div>
        <button onClick={this.change}>改变兄弟2的值</button>
      </div>
    )
  }
  change = () => {
    this.props.changebor2Data('兄弟2值改变了')
  }
}
// 兄弟组件2
import React, { Component } from 'react'

export default class Bor2 extends Component {
  render() {
    return (
      <div>
       {this.props.borData}
      </div>
    )
  }
}

组件通讯 - 跨级组件 Context(不常用,但是是redux的基础)

context实现跨级组件通讯

步骤:1、在最高级组件中创建一个context对象 createContext

​ 2、用解构赋值 解构出Provider,Consumer

​ 3、利用Provider最外层应用,通过value=“data” ,提供共享的数据

data一般是个对象,传递state的值或者当前组件的方法

​ 4、利用Consumer组件去接受共享的数据

​ {data =>接受组件的render内容}

import { createContext } from 'react'
const { Provider, Consumer } = createContext()

// 通过Provider组件包裹,我们需要向child组件传递data
<Provider value="data">
  <div>
    <Child /> 
  </div>
</Provider>

// child组件中使用 Consumer组件接收要共享的数据
<Consumer>
  {data => <span>{data}</span>}
</Consumer>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/274582.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于nodejs+vue班级管理系统的设计与实现-flask-django-python-php

随着电子技术的普及和快速发展&#xff0c;线上管理系统被广泛的使用&#xff0c;有很多事业单位和商业机构都在实现电子信息化管理&#xff0c;班级管理系统也不例外&#xff0c;由比较传统的人工管理转向了电子化、信息化、系统化的管理。随着互联网技术的高速发展&#xff0…

STM32编写ADC功能,实现单路测量电压值(OLED显示)

先来看看本次实验的结果吧&#xff1a;stm32点电压测量范围为0-3.3V&#xff0c;数值为&#xff1a;0-4095 来看看这个工程的文件布局吧&#xff1a; 实现ADC功能总共分为六步&#xff1a; 第一步&#xff1a;开始RCC时钟&#xff0c;包括ADC和GPIO的时钟&#xff0c;ADCCLK的…

六、C#快速排序算法

简介 快速排序是一种常用的排序算法&#xff0c;它基于分治的思想&#xff0c;通过将一个无序的序列分割成两个子序列&#xff0c;并递归地对子序列进行排序&#xff0c;最终完成整个序列的排序。 其基本思路如下&#xff1a; 选择数组中的一个元素作为基准&#xff08;pivot…

SQL server服务连接失败,通过端口1433连接到主机 localhost的 TCP/IP 连接失败

SQL server服务连接失败&#xff0c;通过端口1433连接到主机 localhost的 TCP/IP 连接失败 出现这个错误的时候&#xff0c;首先确保sql的服务正常启动 通常来说正常安装的SQL server之后&#xff0c;会自带一个软件 打开&#xff1a;SQL server配置管理器 确认一下红框内的…

GitHub Copilot+ESP开发实战-串口

上篇文章讲了GitHub Copilot在应用中可能遇到的问题&#xff0c;接下来小启就简单介绍下GitHub Copilot在ESP32开发中C语言实现串口功能&#xff0c;感兴趣的可以看看。 一、向Copilot提问&#xff1a; 1. ESP32用C语言实现串口初始化&#xff1b; 2.配置uart为1&#xff0c…

【STM32嵌入式系统设计与开发】——6矩阵按键应用(4x4)

这里写目录标题 一、任务描述二、任务实施1、SingleKey工程文件夹创建2、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;LED IO初始化函数(LED_Init())&#xff08;3&#xff09;开发板矩阵键盘IO初始化&#xff08;ExpKeyBordInit()&#xff09;&…

QT配置libtorch(一步到位!!!防止踩坑)

QT配置libtorch Qt下载QT配置MSVCQT配置Libtorch Qt下载 Qt点击下载 Qt的安装选择MSVC2017 64-bit(一定要安装&#xff0c;这关乎后面的配置&#xff01;&#xff01;&#xff01;)&#xff0c;其他的根据自己的选择进行安装 QT配置MSVC Visual Studio点击安装 这里需要安装VS以…

Flutter-实现扫描线移动效果

效果 唠叨 在许多应用中&#xff0c;我们经常会看到扫描线的动画效果&#xff0c;比如二维码扫描、条形码扫描等。在Flutter中&#xff0c;我们可以通过自定义控件来实现这种扫描线移动的效果。本文将介绍如何使用Flutter创建一个扫描线移动的控件&#xff0c;并分析其实现思路…

HarmonyOS NEXT应用开发之Navigation实现多设备适配案例

介绍 在应用开发时&#xff0c;一个应用需要适配多终端的设备&#xff0c;使用Navigation的mode属性来实现一套代码&#xff0c;多终端适配。 效果图预览 使用说明 将程序运行在折叠屏手机或者平板上观看适配效果。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a…

学习总结1

算法 这两天对搜索(主要是dfs)进行了复习,写了四道题目. 解题思路 这道题我用dfs进行解题,这道题比起其他的只多了一个Z轴也就是多了两个方向. 代码 #include <string.h> #include <stdio.h> char g[31][31][31]; int ne[7][3]{{1,0,0},{-1,0,0},{0,1,0},{0,-1…

React状态管理库快速上手-Redux(一)

基本使用 安装 pnpm install reduxjs/toolkit react-redux创建一个仓库 定义state createSlice相当于创建了一个模块仓库&#xff0c;initialState存放状态&#xff0c;reducers存放改变状态的方法。 import { createSlice } from reduxjs/toolkitexport const counterSli…

2024.3.19

思维导图 模拟面试 1.友元的作用 答&#xff1a;通过关键字friend&#xff0c;可以让一些函数或者类&#xff0c;可以访问一个类中的私有数据成员。 2.匿名对象的作用 答&#xff1a;匿名对象就是没有名字的对象&#xff0c;是用来给有名对象进行初始化工作的。 3.常成员函…

使用Vscode连接云进行前端开发

使用Vscode连接云进行前端开发 1、ssh连接腾讯云 本人使用的是腾讯云。 然后vscode,用最新版&#xff0c;插件选择remote ssh&#xff0c;或者remote xxx下载过来。 然后点击远程资源管理器&#xff0c;选择SSH通道 然后输入命令如下。 ssh rootip然后输入密码 腾讯云应该…

Java使用itextpdf往pdf中插入图片

引入maven依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.9</version> </dependency>java代码 import cn.hutool.extra.qrcode.QrCodeUtil; import com.itextpdf.text.*; i…

nodejs 使用express插件multer文件上传,接收不到文件的bug

把路径改成绝对路径即可 改成 temp是你想上传到文件夹的路径&#xff0c;一般是在项目根目录下

未来汽车EE架构趋势

多种趋势推动着电动汽车&#xff08;EV&#xff09;、混合动力电动汽车&#xff08;HEV&#xff09;和插电式混合动力电动汽车&#xff08;PHEV&#xff09;的发展。城市化和可持续发展的压力促使各国政府出台支持性法规&#xff0c;使制造商从中受益&#xff0c;而税收优惠政策…

C#,图论与图算法,计算无向连通图中长度为n环的算法与源代码

1 无向连通图中长度为n环 给定一个无向连通图和一个数n,计算图中长度为n的环的总数。长度为n的循环仅表示该循环包含n个顶点和n条边。我们必须统计存在的所有这样的环。 为了解决这个问题,可以有效地使用DFS(深度优先搜索)。使用DFS,我们可以找到特定源(或起点)的长度…

湖北省地质灾害分布数据 崩塌滑坡泥石流空间分布地质灾害详查等数据集

地质灾害是指在自然或者人为因素的作用下形成的&#xff0c;对人类生命财产造成的损失、对环境造成破坏的地质作用或地质现象。地质灾害在时间和空间上的分布变化规律&#xff0c;既受制于自然环境&#xff0c;又与人类活动有关&#xff0c;往往是人类与自然界相互作用的结果。…

Spark-Scala语言实战(3)

在之前的文章中&#xff0c;我们学习了如何在来如何在IDEA离线和在线安装Scala&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark-Scala语言实…

Linux:Gitlab:16.9.2 创建用户及项目仓库基础操作(2)

我在上一章介绍了基本的搭建以及邮箱配置 Linux&#xff1a;Gitlab:16.9.2 (rpm包) 部署及基础操作&#xff08;1&#xff09;-CSDN博客https://blog.csdn.net/w14768855/article/details/136821311?spm1001.2014.3001.5501 本章介绍一下用户的创建&#xff0c;组内设置用户&…
最新文章