React的组件通信与状态管理
目录
1. 组件通讯-概念
了解组件通讯的意义
大致步骤:
- 知道组件的特点
- 知道组件通讯意义
具体内容:
1.组件的特点
- 组件是
独立且封闭的单元,默认情况下,只能使用组件自己的数据 - 在组件化过程中,通常会将一个完整的功能拆分成多个组件,以更好的完成整个应用的功能
2.知道组件通讯意义
- 而在这个过程中,多个组件之间不可避免的要
共享某些数据 - 为了实现这些功能,就需要打破组件的独立封闭性,让其与外界沟通
- 这个过程就是组件通讯
总结:
- 组件状态是独立的,组件化之后涉及状态同步,需要进行组件通讯
2. 组件通讯-props 基本使用
能够通过 props 传递数据和接收数据
大致步骤:
- 传递数据和接收数据的过程
- 函数组件使用 props
- 类组件使用 props
具体内容:
1.传递数据和接收数据的过程
- 使用组件的时候通过属性绑定数据,在组件内部通过 props 获取即可。
2.函数组件使用 props
-
// 使用组件
-
<Hello name="jack" age="20" />
-
// 定义组件 props包含{name:'jack',age:'20'}
-
function Hello(props) {
-
return <div>接收到数据:{props.name}</div>;
-
}
3.类组件使用 props
-
// 使用组件
-
<Hello name="jack" age="20" />
-
// 定义组件 props包含{name:'jack',age:'20'}
-
class Hello extends Component {
-
render() {
-
return <div>接收到的数据:{this.props.age}</div>;
-
}
-
}
总结:
- props 是实现组件通讯的关键,它通过使用组件绑定属性,组件内部使用 props 来传值。
3. 组件通讯-props 注意事项
知道 props 是单项数据流只读,但是可以传递任意数据。
大致步骤:
- 知道什么是单向数据流
- 知道 props 可以传递什么数据
具体内容:
1.知道什么是单向数据流?
- 单向数据流,是从上到下的,
自顶而下的,数据流。 - 好比:河流,瀑布,只能从上往下流动,上游污染下游受影响,但是下游不能影响上游。
- 父组件传递数据给子组件,父组件更新数据子组件自动接收更新后数据,当是子组件是不能修改数据的。
2.props 可以传递什么数据?任意
- 字符串
- 数字
- 布尔
- 数组
- 对象
- 函数
- JSX (插槽)
总结:
- props 传递数据是单向的,可以传递任意格式的数据。
4. 组件通讯-父传子方式
通过 props 将父组件的数据传递给子组件
大致步骤:
- 父组件提供要传递的 state 数据
- 给子组件标签添加属性,值为 state 中的数据
- 子组件中通过 props 接收父组件中传递的数据
具体代码:
1.父组件提供要传递的 state 数据
-
class Parent extends React.Component {
-
state = {
-
money: 10000,
-
};
-
render() {
-
return (
-
<div>
-
<h1>父组件:{this.state.money}</h1>
-
</div>
-
);
-
}
-
}
2.给子组件标签添加属性,值为 state 中的数据
-
class Parent extends React.Component {
-
state = {
-
money: 10000
-
}
-
render() {
-
return (
-
<div>
-
<h1>父组件:{this.state.money}</h1>
-
+ <Child money={this.state.money} />
-
</div>
-
)
-
}
-
}
3.子组件中通过 props 接收父组件中传递的数据
-
function Child(props) {
-
return (
-
<div>
-
<h3>子组件:{props.money}</h3>
-
</div>
-
);
-
}
总结:
- 父组件声明
state,在子组件标签通过属性绑定,在子组件中通过props使用。
5. 组件通讯-子传父方式
通过 props 将子组件的数据传递给父组件
大致步骤:
- 父组件提供回调函数,通过 props 传递给子组件
- 子组件调用 props 中的回调函数,函数可传参
- 父组件函数的参数就是子组件传递的数据
具体代码:
1.父组件
-
class Parent extends React.Component {
-
state = {
-
money: 10000,
-
};
-
// 回调函数
-
buyPhone = (price) => {
-
this.setState({
-
money: this.state.money - price,
-
});
-
};
-
render() {
-
const { money } = this.state;
-
return (
-
<div>
-
<h1>父组件:{money}</h1>
-
<Child money={money} buyPhone={this.buyPhone} />
-
</div>
-
);
-
}
-
}
2.子组件
-
const Child = (props) => {
-
const handleClick = () => {
-
// 子组件调用父组件传递过来的回调函数
-
props.buyPhone(5000);
-
};
-
return (
-
<div>
-
<h3>子组件:{props.money}</h3>
-
<button onClick={handleClick}>买手机</button>
-
</div>
-
);
-
};
总结:
- 子组件如何传递数据给父组件?触发父组件传递的回调函数传入数据
- 父组件如何接收子组件的数据?回调函数的参数是子组件传递的数据
- 父组件数据更新后,传递给子组件的数据是否更新?自动更新
6.组件通讯-兄弟组件通讯
通过状态提升思想完成兄弟组件数据通讯
大致步骤:
- 状态提升思想是什么?
- 演示通过状态提升完成兄弟组件通讯。
具体内容:
1.状态提升思想是什么?
- 将共享状态提升到最近的公共父组件中,由公共父组件管理这个状态和修改状态的方法

- 需要通讯的组件通过 props 接收状态和函数即可
2.参考代码
index.js
-
import React, { Component } from 'react';
-
import ReactDOM from 'react-dom';
-
-
// 导入两个子组件
-
import Jack from './Jack';
-
import Rose from './Rose';
-
-
// App 是父组件
-
class App extends Component {
-
// 1. 状态提升到父组件
-
state = {
-
msg: '',
-
};
-
-
changeMsg = (msg) => {
-
this.setState({ msg });
-
};
-
-
render() {
-
return (
-
<div>
-
<h1>我是App组件</h1>
-
{/* 兄弟组件 1 */}
-
<Jack changeMsg={this.changeMsg}></Jack>
-
{/* 兄弟组件 2 */}
-
<Rose msg={this.state.msg}></Rose>
-
</div>
-
);
-
}
-
}
-
-
// 渲染组件
-
ReactDOM.render(<App />, document.getElementById('root'));
Jack.js
-
import React, { Component } from 'react';
-
-
export default class Jack extends Component {
-
say = () => {
-
// 修改数据
-
this.props.changeMsg('you jump i look');
-
};
-
render() {
-
return (
-
<div>
-
<h3>我是Jack组件</h3>
-
<button onClick={this.say}>说</button>
-
</div>
-
);
-
}
-
}
Rose.jsx
-
import React, { Component } from 'react';
-
-
export default class Rose extends Component {
-
render() {
-
return (
-
<div>
-
<h3>我是Rose组件-{this.props.msg}</h3>
-
</div>
-
);
-
}
-
}
7. 组件通讯-context 跨级组件通讯
掌握使用 context 实现跨级组件通讯
大致步骤:
- 什么是跨级组件通讯?
- context 怎么去理解?
- 演示使用 context 完成跨级组件通讯。
具体内容:
1.什么是跨级组件通讯?
- 组件间相隔多层,理解成叔侄,甚至更远的亲戚。
2.context 怎么去理解?
- 术语:上下文
- 理解:一个范围,只要在这个范围内,就可以跨级组件通讯。(不需要 props 层层传递)
3.演示使用 context 完成跨级组件通讯
index.jsx
-
import React, { Component, createContext } from 'react'
-
import Parent from './Parent'
-
-
// 1. 创建上下文对象
-
// @ts-ignore
-
export const MyContext = createContext()
-
-
export default class App extends Component {
-
state = {
-
money: 10000
-
}
-
updateMoney = newMoney => {
-
this.setState({
-
money: newMoney
-
})
-
}
-
render() {
-
return (
-
// 2. Provider包裹确定上下文生效范围,value注入范围内可用的数据
-
<MyContext.Provider value={{
-
money: this.state.money,
-
updateMoney: this.updateMoney
-
}}>
-
<div className="app">
-
<h1>根组件:{this.state.money}</h1>
-
<hr />
-
<Parent />
-
</div>
-
</MyContext.Provider>
-
)
-
}
-
}
Parent.jsx
-
import Child from './Child';
-
const Parent = () => {
-
return (
-
<div className="parent">
-
<h3>父组件:</h3>
-
<hr />
-
<Child />
-
</div>
-
);
-
};
-
-
export default Parent;
Child.jsx
-
import { MyContext } from './App'
-
-
const Child = () => {
-
return (
-
// 3. 通过Consumer来消费数据,value=>{ 这里使用数据 }
-
<MyContext.Consumer>
-
{(value) => (
-
<div className="child">
-
<h5>子组件:{value.money} <button onClick={()=>value.updateMoney(5000)}>修改money</button></h5>
-
</div>
-
)}
-
</MyContext.Consumer>
-
);
-
};
-
-
export default Child;
总结:
- 使用
creatContext()创建一个上下文对象,包含:ProviderConsumer组件。 - 使用
Provider包裹组件,value属性注入状态,函数,被包裹组件下的任何组件可以使用。 - 使用
Consumer消费Provider提供的数据和函数,语法{value=>使用数据和函数}
原文链接:点这里进入哦
React的组件通信与状态管理的更多相关文章
- react的组件通信
react的组件通信 1.父组件传子组件 import React, {Component} from 'react'class Father extends Component{ render() ...
- React之组件通信
组件通信无外乎,下面这三种父子组件,子父组件,平行组件(也叫兄弟组件)间的数据传输.下面我们来分别说一下: 父子组件: var Demo=React.createClass({ getInitialS ...
- React项目中使用Mobx状态管理(二)
并上一节使用的是普通的数据状态管理,不过官方推荐使用装饰器模式,而在默认的react项目中是不支持装饰器的,需要手动启用. 官方参考 一.添加配置 官方提供了四种方法, 方法一.使用TypeScrip ...
- React项目中使用Mobx状态管理(一)
1.安装 $ yarn add mobx mobx-react 2.新建store/index.js,存放数据(以下思路仅限于父子组件的简单应用) 注意:这里暂时没使用装饰器@observable,装 ...
- React中组件通信的几种方式
https://segmentfault.com/a/1190000012361461 需要组件之进行通信的几种情况 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 ...
- 5.React中组件通信问题
1.父组件传递值给子组件 想必这种大家都是知道的吧!都想到了用我们react中的props,那么我在这简单的写了小demo,请看父组件 class Parent extends Component{ ...
- react 父子组件通信
import React from 'react'; import B from './B'; class A extends React.Component{ state = { msg:'我来自于 ...
- react-redux --》react中 最好用的状态管理方式
一.Redux与组件 react-redux是一个第三方插件使我们在react上更方便的来使用redux这个数据架构 React-Redux提供connect方法,用于从UI组件生成容器组件,conn ...
- React状态管理相关
关于React状态管理的一些想法 我最开始使用React的时候,那个时候版本还比较低(16版本以前),所以状态管理都是靠React自身API去进行管理,但当时最大的问题就是跨组件通信以及状态同步和状态 ...
- React中组件间通信的方式
React中组件间通信的方式 React中组件间通信包括父子组件.兄弟组件.隔代组件.非嵌套组件之间通信. Props props适用于父子组件的通信,props以单向数据流的形式可以很好的完成父子组 ...
随机推荐
- POJ:3279-Fliptile【状态压缩】【DFS】
POJ-3279 经典[状态压缩][DFS]题型 题目大意:有一个 M * N 的格子,每个格子可以翻转正反面,它们有一面是黑色,另一面是白色.黑色翻转之后变成白色,白色翻转之后则变成黑色. 游戏要做 ...
- jdk1.8: Consumer函数
场景: 当我们在a方法中,需要把某些参数赋值给一个Integer类型的对象,而该对象只有在b方法才能赋值,那么我们可以在a方法中使用consumer记录我们要执行的操作,再把consumer作为参数传 ...
- HanLP — 汉字转拼音,简繁转换 -- JAVA
目录 语料库 训练 加载语料库 训练模型 保存模型 加载模型 计算 调用 HanLP 在汉字转拼音时,可以解决多音字问题,显示输出声调,声母.韵母,通过训练语料库, 本文代码为<自然语言处理入门 ...
- node-sass安装失败问题
在node 中安装sass依赖总会出现各种各样的问题,第一次遇见这样的问题 Cached binary found at C:\Users\ltzhouhuan\AppData\Roaming\npm ...
- Autowired注入Service变成了biaomidou的Mapper代理
问题概述 一个Springboot工程,使用Mybatis-plus作为数据层框架 使用@MapperScan注解扫描Mapper接口 @MapperScan("org.net5ijy.cl ...
- 【FreeRTOS】内核查找最高优先级就绪任务
查找最高优先级就绪任务 FreeRTOS\Source\tasks.c #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) /* If confi ...
- 【RTOS】基于RTOS的降低功耗的策略
RTOS中降低功耗的策略 Saving Power with an RTOS 介绍 随着绿色节能产品需求的增加,快速增长的移动设备,其电池寿命最受关注,设计者必须要考虑在其设计中如何最大限度的降低功耗 ...
- SpringMVC01——回顾MVC
1.1什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织代码. MVC主要作用是降低了视图 ...
- Oracle19c 多字符集支持的PDB
Oracle19c 多字符集支持的PDB 背景 想在一个数据库里面支持多种字符集 突然发现Oracle12c开始已经可以实现一个CDB下面可以有多个不同字符集的PDB了 所以想着今天验证一下. 环境信 ...
- 部分MySQL的SQL信息整理
模块补丁信息查看 select su as 补丁模块, count(1) as 数量 from gsppatchlog where TO_DAYS( NOW( ) ) - TO_DAYS(deploy ...