目录

1. 组件通讯-概念

1.组件的特点

2.知道组件通讯意义

总结:

2. 组件通讯-props 基本使用

1.传递数据和接收数据的过程

2.函数组件使用 props

3.类组件使用 props

总结:

3. 组件通讯-props 注意事项

1.知道什么是单向数据流?

2.props 可以传递什么数据?任意

总结:

4. 组件通讯-父传子方式

1.父组件提供要传递的 state 数据

2.给子组件标签添加属性,值为 state 中的数据

3.子组件中通过 props 接收父组件中传递的数据

总结:

5. 组件通讯-子传父方式

1.父组件

2.子组件

总结:

6.组件通讯-兄弟组件通讯

1.状态提升思想是什么?

2.参考代码

7. 组件通讯-context 跨级组件通讯

1.什么是跨级组件通讯?

2.context 怎么去理解?

3.演示使用 context 完成跨级组件通讯

总结:

1. 组件通讯-概念

了解组件通讯的意义

大致步骤:

  • 知道组件的特点
  • 知道组件通讯意义

具体内容:

1.组件的特点

  • 组件是独立且封闭的单元,默认情况下,只能使用组件自己的数据
  • 在组件化过程中,通常会将一个完整的功能拆分成多个组件,以更好的完成整个应用的功能

2.知道组件通讯意义

  • 而在这个过程中,多个组件之间不可避免的要共享某些数据
  • 为了实现这些功能,就需要打破组件的独立封闭性,让其与外界沟通
  • 这个过程就是组件通讯

总结:

  • 组件状态是独立的,组件化之后涉及状态同步,需要进行组件通讯

2. 组件通讯-props 基本使用

能够通过 props 传递数据和接收数据

大致步骤:

  • 传递数据和接收数据的过程
  • 函数组件使用 props
  • 类组件使用 props

具体内容:

1.传递数据和接收数据的过程

  • 使用组件的时候通过属性绑定数据,在组件内部通过 props 获取即可。

2.函数组件使用 props


  1. // 使用组件
  2. <Hello name="jack" age="20" />

  1. // 定义组件 props包含{name:'jack',age:'20'}
  2. function Hello(props) {
  3. return <div>接收到数据:{props.name}</div>;
  4. }

3.类组件使用 props


  1. // 使用组件
  2. <Hello name="jack" age="20" />

  1. // 定义组件 props包含{name:'jack',age:'20'}
  2. class Hello extends Component {
  3. render() {
  4. return <div>接收到的数据:{this.props.age}</div>;
  5. }
  6. }

总结:

  • props 是实现组件通讯的关键,它通过使用组件绑定属性,组件内部使用 props 来传值。

3. 组件通讯-props 注意事项

知道 props 是单项数据流只读,但是可以传递任意数据。

大致步骤:

  • 知道什么是单向数据流
  • 知道 props 可以传递什么数据

具体内容:

1.知道什么是单向数据流

  • 单向数据流,是从上到下的,自顶而下的,数据流。
  • 好比:河流,瀑布,只能从上往下流动,上游污染下游受影响,但是下游不能影响上游。
  • 父组件传递数据给子组件,父组件更新数据子组件自动接收更新后数据,当是子组件是不能修改数据的。

2.props 可以传递什么数据?任意

  • 字符串
  • 数字
  • 布尔
  • 数组
  • 对象
  • 函数
  • JSX (插槽)

总结:

  • props 传递数据是单向的,可以传递任意格式的数据。

4. 组件通讯-父传子方式

通过 props 将父组件的数据传递给子组件

大致步骤:

  • 父组件提供要传递的 state 数据
  • 给子组件标签添加属性,值为 state 中的数据
  • 子组件中通过 props 接收父组件中传递的数据

具体代码:

1.父组件提供要传递的 state 数据


  1. class Parent extends React.Component {
  2. state = {
  3. money: 10000,
  4. };
  5. render() {
  6. return (
  7. <div>
  8. <h1>父组件:{this.state.money}</h1>
  9. </div>
  10. );
  11. }
  12. }

2.给子组件标签添加属性,值为 state 中的数据


  1. class Parent extends React.Component {
  2. state = {
  3. money: 10000
  4. }
  5. render() {
  6. return (
  7. <div>
  8. <h1>父组件:{this.state.money}</h1>
  9. + <Child money={this.state.money} />
  10. </div>
  11. )
  12. }
  13. }

3.子组件中通过 props 接收父组件中传递的数据


  1. function Child(props) {
  2. return (
  3. <div>
  4. <h3>子组件:{props.money}</h3>
  5. </div>
  6. );
  7. }

总结:

  • 父组件声明state,在子组件标签通过属性绑定,在子组件中通过props使用。

5. 组件通讯-子传父方式

通过 props 将子组件的数据传递给父组件

大致步骤:

  • 父组件提供回调函数,通过 props 传递给子组件
  • 子组件调用 props 中的回调函数,函数可传参
  • 父组件函数的参数就是子组件传递的数据

具体代码:

1.父组件


  1. class Parent extends React.Component {
  2. state = {
  3. money: 10000,
  4. };
  5. // 回调函数
  6. buyPhone = (price) => {
  7. this.setState({
  8. money: this.state.money - price,
  9. });
  10. };
  11. render() {
  12. const { money } = this.state;
  13. return (
  14. <div>
  15. <h1>父组件:{money}</h1>
  16. <Child money={money} buyPhone={this.buyPhone} />
  17. </div>
  18. );
  19. }
  20. }

 2.子组件


  1. const Child = (props) => {
  2. const handleClick = () => {
  3. // 子组件调用父组件传递过来的回调函数
  4. props.buyPhone(5000);
  5. };
  6. return (
  7. <div>
  8. <h3>子组件:{props.money}</h3>
  9. <button onClick={handleClick}>买手机</button>
  10. </div>
  11. );
  12. };

总结:

  • 子组件如何传递数据给父组件?触发父组件传递的回调函数传入数据
  • 父组件如何接收子组件的数据?回调函数的参数是子组件传递的数据
  • 父组件数据更新后,传递给子组件的数据是否更新?自动更新

6.组件通讯-兄弟组件通讯

通过状态提升思想完成兄弟组件数据通讯

大致步骤:

  • 状态提升思想是什么?
  • 演示通过状态提升完成兄弟组件通讯。

具体内容:

1.状态提升思想是什么?

  • 将共享状态提升到最近的公共父组件中,由公共父组件管理这个状态和修改状态的方法

  • 需要通讯的组件通过 props 接收状态和函数即可

2.参考代码

index.js


  1. import React, { Component } from 'react';
  2. import ReactDOM from 'react-dom';
  3. // 导入两个子组件
  4. import Jack from './Jack';
  5. import Rose from './Rose';
  6. // App 是父组件
  7. class App extends Component {
  8. // 1. 状态提升到父组件
  9. state = {
  10. msg: '',
  11. };
  12. changeMsg = (msg) => {
  13. this.setState({ msg });
  14. };
  15. render() {
  16. return (
  17. <div>
  18. <h1>我是App组件</h1>
  19. {/* 兄弟组件 1 */}
  20. <Jack changeMsg={this.changeMsg}></Jack>
  21. {/* 兄弟组件 2 */}
  22. <Rose msg={this.state.msg}></Rose>
  23. </div>
  24. );
  25. }
  26. }
  27. // 渲染组件
  28. ReactDOM.render(<App />, document.getElementById('root'));

 Jack.js


  1. import React, { Component } from 'react';
  2. export default class Jack extends Component {
  3. say = () => {
  4. // 修改数据
  5. this.props.changeMsg('you jump i look');
  6. };
  7. render() {
  8. return (
  9. <div>
  10. <h3>我是Jack组件</h3>
  11. <button onClick={this.say}>说</button>
  12. </div>
  13. );
  14. }
  15. }

 Rose.jsx


  1. import React, { Component } from 'react';
  2. export default class Rose extends Component {
  3. render() {
  4. return (
  5. <div>
  6. <h3>我是Rose组件-{this.props.msg}</h3>
  7. </div>
  8. );
  9. }
  10. }

7. 组件通讯-context 跨级组件通讯

掌握使用 context 实现跨级组件通讯

大致步骤:

  • 什么是跨级组件通讯?
  • context 怎么去理解?
  • 演示使用 context 完成跨级组件通讯。

具体内容:

1.什么是跨级组件通讯?

  • 组件间相隔多层,理解成叔侄,甚至更远的亲戚。

2.context 怎么去理解?

  • 术语:上下文
  • 理解:一个范围,只要在这个范围内,就可以跨级组件通讯。(不需要 props 层层传递)

3.演示使用 context 完成跨级组件通讯

index.jsx


  1. import React, { Component, createContext } from 'react'
  2. import Parent from './Parent'
  3. // 1. 创建上下文对象
  4. // @ts-ignore
  5. export const MyContext = createContext()
  6. export default class App extends Component {
  7. state = {
  8. money: 10000
  9. }
  10. updateMoney = newMoney => {
  11. this.setState({
  12. money: newMoney
  13. })
  14. }
  15. render() {
  16. return (
  17. // 2. Provider包裹确定上下文生效范围,value注入范围内可用的数据
  18. <MyContext.Provider value={{
  19. money: this.state.money,
  20. updateMoney: this.updateMoney
  21. }}>
  22. <div className="app">
  23. <h1>根组件:{this.state.money}</h1>
  24. <hr />
  25. <Parent />
  26. </div>
  27. </MyContext.Provider>
  28. )
  29. }
  30. }

Parent.jsx


  1. import Child from './Child';
  2. const Parent = () => {
  3. return (
  4. <div className="parent">
  5. <h3>父组件:</h3>
  6. <hr />
  7. <Child />
  8. </div>
  9. );
  10. };
  11. export default Parent;

Child.jsx


  1. import { MyContext } from './App'
  2. const Child = () => {
  3. return (
  4. // 3. 通过Consumer来消费数据,value=>{ 这里使用数据 }
  5. <MyContext.Consumer>
  6. {(value) => (
  7. <div className="child">
  8. <h5>子组件:{value.money} <button onClick={()=>value.updateMoney(5000)}>修改money</button></h5>
  9. </div>
  10. )}
  11. </MyContext.Consumer>
  12. );
  13. };
  14. export default Child;

总结:

  • 使用creatContext()创建一个上下文对象,包含:Provider Consumer 组件。
  • 使用 Provider 包裹组件,value 属性注入状态,函数,被包裹组件下的任何组件可以使用。
  • 使用 Consumer 消费 Provider 提供的数据和函数,语法{value=>使用数据和函数}

原文链接:点这里进入哦

React的组件通信与状态管理的更多相关文章

  1. react的组件通信

    react的组件通信 1.父组件传子组件 import React, {Component} from 'react'class Father extends Component{ render() ...

  2. React之组件通信

    组件通信无外乎,下面这三种父子组件,子父组件,平行组件(也叫兄弟组件)间的数据传输.下面我们来分别说一下: 父子组件: var Demo=React.createClass({ getInitialS ...

  3. React项目中使用Mobx状态管理(二)

    并上一节使用的是普通的数据状态管理,不过官方推荐使用装饰器模式,而在默认的react项目中是不支持装饰器的,需要手动启用. 官方参考 一.添加配置 官方提供了四种方法, 方法一.使用TypeScrip ...

  4. React项目中使用Mobx状态管理(一)

    1.安装 $ yarn add mobx mobx-react 2.新建store/index.js,存放数据(以下思路仅限于父子组件的简单应用) 注意:这里暂时没使用装饰器@observable,装 ...

  5. React中组件通信的几种方式

    https://segmentfault.com/a/1190000012361461 需要组件之进行通信的几种情况 父组件向子组件通信 子组件向父组件通信 跨级组件通信 没有嵌套关系组件之间的通信 ...

  6. 5.React中组件通信问题

    1.父组件传递值给子组件 想必这种大家都是知道的吧!都想到了用我们react中的props,那么我在这简单的写了小demo,请看父组件 class Parent extends Component{ ...

  7. react 父子组件通信

    import React from 'react'; import B from './B'; class A extends React.Component{ state = { msg:'我来自于 ...

  8. react-redux --》react中 最好用的状态管理方式

    一.Redux与组件 react-redux是一个第三方插件使我们在react上更方便的来使用redux这个数据架构 React-Redux提供connect方法,用于从UI组件生成容器组件,conn ...

  9. React状态管理相关

    关于React状态管理的一些想法 我最开始使用React的时候,那个时候版本还比较低(16版本以前),所以状态管理都是靠React自身API去进行管理,但当时最大的问题就是跨组件通信以及状态同步和状态 ...

  10. React中组件间通信的方式

    React中组件间通信的方式 React中组件间通信包括父子组件.兄弟组件.隔代组件.非嵌套组件之间通信. Props props适用于父子组件的通信,props以单向数据流的形式可以很好的完成父子组 ...

随机推荐

  1. POJ:3279-Fliptile【状态压缩】【DFS】

    POJ-3279 经典[状态压缩][DFS]题型 题目大意:有一个 M * N 的格子,每个格子可以翻转正反面,它们有一面是黑色,另一面是白色.黑色翻转之后变成白色,白色翻转之后则变成黑色. 游戏要做 ...

  2. jdk1.8: Consumer函数

    场景: 当我们在a方法中,需要把某些参数赋值给一个Integer类型的对象,而该对象只有在b方法才能赋值,那么我们可以在a方法中使用consumer记录我们要执行的操作,再把consumer作为参数传 ...

  3. HanLP — 汉字转拼音,简繁转换 -- JAVA

    目录 语料库 训练 加载语料库 训练模型 保存模型 加载模型 计算 调用 HanLP 在汉字转拼音时,可以解决多音字问题,显示输出声调,声母.韵母,通过训练语料库, 本文代码为<自然语言处理入门 ...

  4. node-sass安装失败问题

    在node 中安装sass依赖总会出现各种各样的问题,第一次遇见这样的问题 Cached binary found at C:\Users\ltzhouhuan\AppData\Roaming\npm ...

  5. Autowired注入Service变成了biaomidou的Mapper代理

    问题概述 一个Springboot工程,使用Mybatis-plus作为数据层框架 使用@MapperScan注解扫描Mapper接口 @MapperScan("org.net5ijy.cl ...

  6. 【FreeRTOS】内核查找最高优先级就绪任务

    查找最高优先级就绪任务 FreeRTOS\Source\tasks.c #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) /* If confi ...

  7. 【RTOS】基于RTOS的降低功耗的策略

    RTOS中降低功耗的策略 Saving Power with an RTOS 介绍 随着绿色节能产品需求的增加,快速增长的移动设备,其电池寿命最受关注,设计者必须要考虑在其设计中如何最大限度的降低功耗 ...

  8. SpringMVC01——回顾MVC

    1.1什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑.数据.显示分离的方法来组织代码. MVC主要作用是降低了视图 ...

  9. Oracle19c 多字符集支持的PDB

    Oracle19c 多字符集支持的PDB 背景 想在一个数据库里面支持多种字符集 突然发现Oracle12c开始已经可以实现一个CDB下面可以有多个不同字符集的PDB了 所以想着今天验证一下. 环境信 ...

  10. 部分MySQL的SQL信息整理

    模块补丁信息查看 select su as 补丁模块, count(1) as 数量 from gsppatchlog where TO_DAYS( NOW( ) ) - TO_DAYS(deploy ...