目录

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. 2016年第七届 蓝桥杯C组 C/C++决赛题解

    蓝桥杯历年国赛真题汇总:Here 1.平方末尾 能够表示为某个整数的平方的数字称为"平方数" 比如,25,64 虽然无法立即说出某个数是平方数,但经常可以断定某个数不是平方数. 因 ...

  2. 第九届蓝桥杯(2018)C/C++大学A组省赛题解

    第一题:分数 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + - 每项是前一项的一半,如果一共有20项, 求这个和是多少,结果用分数表示出来. 类似:3/2 当然,这只是加了前2项而已. ...

  3. 智慧风电:数字孪生 3D 风机智能设备运维

    前言 6 月 1 日,福建省人民政府发布关于<福建省"十四五"能源发展专项规划>的通知.规划要求,加大风电建设规模.自 "30·60" 双碳目标颁布 ...

  4. 三、docker容器的常用命令

    系列导航 一.docker入门(概念) 二.docker的安装和镜像管理 三.docker容器的常用命令 四.容器的网络访问 五.容器端口转发 六.docker数据卷 七.手动制作docker镜像 八 ...

  5. 黑马vue学习笔记

    1.v-model原理 2.数组相关API 3.prop命名规则: 4.非父子组件传值-事件中心

  6. v-cloak指令用法

    插值表达式存在的问题:'闪动' 如何解决该问题:使用v-cloak指令 解决该问题的原理:先隐藏,替换好值之后再显示最终的值 背后的原理:先通过样式隐藏内容,然后在内存中进行值得替换,替换好之后再显示 ...

  7. java基础-流程控制-day04

    目录 1. if单分支 2. if else 多分支 3. if else双分支 4. 随机生成一定区间的整数 5 switch语句 6. while循环 7. for循环 8. break cont ...

  8. MPC 是下一代私钥安全的7大原因

    PrimiHub一款由密码学专家团队打造的开源隐私计算平台,专注于分享数据安全.密码学.联邦学习.同态加密等隐私计算领域的技术和内容. 多重签名钱包与单一密钥钱包相比,因其提升了资产安全性,如今已成为 ...

  9. idea报错 "cannot access ..."的解决办法

    File -> Invalidate Caches -> Invalidate and Restart

  10. Go——语言特性

    golang 简介 来历 很久以前,有一个IT公司,这公司有个传统,允许员工拥有20%自由时间来开发实验性项目.在2007的某一天,公司的几个大牛,正在用c++开发一些比较繁琐但是核心的工作,主要包括 ...