目录

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. POJ3414 Pots( BFS搜索)

    题目: 给你两个容器,分别能装下A升水和B升水,并且可以进行以下操作 FILL(i) 将第i个容器从水龙头里装满(1 ≤ i ≤ 2); DROP(i) 将第i个容器抽干 POUR(i,j) 将第i个 ...

  2. 活动回顾|阿里云 Serverless 技术实战与创新成都站回放&PPT下载

    7月29日"阿里云 Serverless 技术实战与创新"成都站圆满落幕.活动受众以关注 Serverless 技术的开发者.企业决策人.云原生领域创业者为主,活动形式为演讲.动手 ...

  3. C#读取FX5U线圈(modbusTCP)

    第一步:导入所需的类库 第二步:包含命名空间 第三步:实例化modbus类 ModbusTcpNet busTcpClient = null; busTcpClient = new ModbusTcp ...

  4. 图文ASP.Net MVC Razor页面中HtmlHelper帮助程序的写法

    将以下内容复制到cshtml文件中 @using Microsoft.AspNetCore.Html @{ ViewData["Title"] = ""; } ...

  5. 2023第十四届极客大挑战 — CRYPTO(WP全)

    浅谈: 本次大挑战我们队伍也是取得了第一名的成绩,首先要感谢同伴的陪伴和帮助.在共同的努力下终不负期望! 但遗憾的是我们没有在某个方向全通关的,呜呜呜~ 继续努力吧!要学的还很多.明年有机会再战!!加 ...

  6. [转帖]Region Merge Config

    TiKV replicates a segment of data in Regions via the Raft state machine. As data writes increase, a ...

  7. [转帖]一个小操作,SQL 查询速度翻了 1000 倍

    https://tidb.net/book/tidb-monthly/2022/2022-04/usercase/sql-1000 背景介绍​ 某一天早上来到公司,接到业务同学反馈,线上某个SQL之前 ...

  8. [转帖]CentOS7上systemctl的使用

    https://www.cnblogs.com/yeyuzhuanjia/p/14676182.html CentOS 7.x开始,CentOS开始使用systemd服务来代替daemon,原来管理系 ...

  9. [转帖]Linux—vi/vim全局替换

    https://www.jianshu.com/p/4daa5dbc7dd5 vim全局替换   在linux系统中编辑文件或者配置时,常常会用到全局替换功能. 语法格式 :%s/oldWords/n ...

  10. [转帖][译]ARM大小核架构白皮书

    https://zhuanlan.zhihu.com/p/33411449 ARM big.LITTLE Processing with ARM Cortex-A15 & Cortex-A7 ...