组件通信

文章目录

  • 组件通信
    • 1 组件的props
      • 1.1 作用
      • 1.2 组件标签属性来传递数据
      • 1.3 函数组件和类组件来接收数据
      • 1.4 props特点
      • 1.5 children属性
      • 1.6 props校验
    • 2 父传子
    • 3 子传父
    • 4 兄弟组件之间传递
    • 5 Context

1 组件的props

Props 是组件的配置。

props 由父组件传递给子组件,并且就子组件而言,props 是不可变的。

1.1 作用

  • 接收传递给组件的数据

1.2 组件标签属性来传递数据

  • 通过给组件标签添加属性的方式传递数据。

    ReactDOM.render(<Person name="Silly" age={21} />, document.getElementById('root'))
    

1.3 函数组件和类组件来接收数据

  • props是一个对象。

    • 函数组件:通过参数props接收数据。
    • 类组件:通过this.props接收数据。
// 1、函数组件接收数据---通过参数props接收
import React from 'react';
import ReactDOM from 'react-dom';const Person = (props) => {console.log(props);return (<div><h1>props:{props.name}</h1><h1>props:{props.age}</h1></div>)
}
//传递数据name、age
ReactDOM.render(<Person name="Silly" age={21} />, document.getElementById('root'))
// 2、类组件接收数据---通过this.props接收
import React from 'react';
import ReactDOM from 'react-dom'; class Person extends React.Component {render() {return (<div><h1>类props:{this.props.name}</h1><h1>类props:{this.props.age}</h1></div>)}
}
//传递数据name、age
ReactDOM.render(<Person name="Silly" age={21} />, document.getElementById('root'))

1.4 props特点

  1. 可以给组件传递任意类型的数据。

    • 字符串、数字、函数、对象、数组、标签
    <Person name="Silly" age={21} obj={{ id: 11, name: '狗蛋儿', age: 18 }}friends={['SillyGirl','SillyMan','SillyWoman']}fn={()=>{console.log("函数内打印一句话")}}tag={<p>传递过去一个标签内容</p>}
    />
    
  2. props是一个只读的对象。

  3. 使用类组件时,若也使用了构造函数,那么应该把props传递给super(),不然无法在构造函数中获取到props。

    import React from 'react';
    import ReactDOM from 'react-dom';// 2、类组件接收数据---通过this.props接收
    class Person extends React.Component {constructor(props) {super(props)console.log('构造函数内:', props);}render() {console.log('render内:', this.props);return (<div><h1>类props:{this.props.name}</h1><h1>类props:{this.props.age}</h1></div>)}
    }ReactDOM.render(<Personname="Silly"age={21}obj={{ id: 11, name: '狗蛋二', age: 18 }}friends={['SillyGirl', 'SillyMan', 'SillyWoman']}fn={() => { console.log("函数内打印一句话") }}tag={<p>传递过去一个标签内容</p>}/>,document.getElementById('root'))
    

1.5 children属性

  • props.children
  • children属性表示组件标签的子节点。当组件标签中有子节点时,props就会有一个children属性。
  • children属性与普通props一样,值可以是任意类型。
    • 字符串、组件、函数、React元素
class Person extends React.Component {render() {return (<div><h1>props的children属性:{this.props.children}</h1></div>)}
}
ReactDOM.render(<Person>我是子节点</Person>, document.getElementById('root'))

1.6 props校验

  • props校验:允许在创建组件的时候,指定组件的类型、格式等。
  • 作用:捕获相关错误并作出明确提示,增加组建的健壮性
    • 如不符合校验规则,会报错:Failed prop type:...

使用步骤:

  • 安装prop-types包。

    npm install prop-types
    //或
    yarn add prop-types
    
  • 导入包。

    import PropTypes from 'prop-types'
    
  • 使用**组件名.propTypes = {}**给组件添加校验规则。

    Person.propTypes = {}
    
  • 校验规则通过PropTypes对象来指定。

    Person.propTypes = {age:PropTypes.number,name:PropTypes.string
    }
    

约束规则:

  1. 常见类型:number、string、object、func、bool、array、symbol
  2. React元素类型:element
  3. 设置校验项为必填项:.isRequired
  4. 特定结构的对象:PropTypes.shape({ })
Person.propTypes = {age:PropTypes.number,name:PropTypes.string,fn:PropTypes.func.isRequired,tag:PropTypes.element,filterLPropTypes.shape({price:PropTypes.number,name:PropTypes.string})
}

2 父传子

  1. 父组件在state里面提供要传递的数据。
  2. 在子组件中添加属性,属性值为state里面的待传递值。
  3. 子组件通过props接收数据。
import React from 'react';
import ReactDOM from 'react-dom';class Person extends React.Component {state = {userName: 'SillyBoy'}render() {return (<div><p>我是父组件</p><Child name={this.state.userName} /></div>)}
}
const Child = (props) => {return (<div><p>我是子组件</p><span>接收到数据:{props.name}</span></div>)
}ReactDOM.render(<Person />, document.getElementById('root'))

3 子传父

子组件向父组件传递数据的思路为:利用回调函数。

父组件提供回调函数;

子组件来调用,将要传递过去的数据作为回调函数的参数。

  1. 父组件提供用于接收数据的回调函数。
  2. 父组件将函数作为属性的值,传递给子组件。
  3. 子组件通过props调用回调函数。
  4. 子组件将要传递的数据作为参数传递给回调函数。
import React from 'react';
import ReactDOM from 'react-dom';//父组件
class Person extends React.Component {state = {parentMsg: ''}getChildMessage = data => {console.log('父组件函数接收子组件传递的值成功!:', data);this.setState({parentMsg: data})}render() {return (<div><p>我是父组件,接收到:{this.state.parentMsg}</p><Child getMsg={this.getChildMessage} /></div>)}
}
//子组件
class Child extends React.Component {state = {msg: '你爱我,我爱你,蜜雪冰城甜蜜蜜'}handlerClick = () => {this.props.getMsg(this.state.msg)}render() {return (<div><p>我是子组件,要传递:{this.state.msg}</p><button onClick={this.handlerClick}>点击传递给父组件</button></div>)}
}ReactDOM.render(<Person />, document.getElementById('root'))

4 兄弟组件之间传递

思想:把共享状态提升到离他们最近的公共父组件内,由父组件来管理此状态。即状态提升。

  1. 父组件职责:

    1. 提供共享状态
    2. 提供操作共享状态的方法
  2. 子组件:通过props接收或操作状态。
import React from 'react';
import ReactDOM from 'react-dom';
// import Person from './js/Person'// 公共父组件
class Person extends React.Component {state = {allCount: 0}addNum = () => {this.setState({allCount: this.state.allCount + 1})}render() {return (<div><Child1 count={this.state.allCount} /><Child2 clickIt={this.addNum} /></div>)}
}
// 子组件一
class Child1 extends React.Component {render() {return (<h1>数字:{this.props.count}</h1>)}
}
// 子组件二
class Child2 extends React.Component {render() {return (<button onClick={() => this.props.clickIt()}>加1</button>)}
}ReactDOM.render(<Person />, document.getElementById('root'))

5 Context

若两个组件之间是属于远房亲戚,是多层的嵌套,适合使用此方法来传递数据

  • 作用:跨组件传递数据。

使用步骤

  1. 调用React.createContext()创建Provider和Consumer两个组件。

    • Provider:提供数据
    • Consumer:消费数据
  2. 使用Provider组件作为父组件。
  3. 在Provider中设置value属性,表示要传递的值。
  4. 调用Consumer组件接收数据。
    • Consumer里面是一个特殊的语法,一个有返回值的函数。
    • 通过回调函数的参数就能拿到传递过来的数据。
const { Provider,Consumer} = React.createContext()
import React from 'react';
import ReactDOM from 'react-dom';const { Provider, Consumer } = React.createContext()
// 组件之间的父子关系:Person > Father > Son
class Person extends React.Component {render() {return (<Provider value="fa6400"><div><Father /></div></Provider>)}
}class Father extends React.Component {render() {return (<div><Son /></div>)}
}class Son extends React.Component {render() {return (<Consumer>{data => <span>data参数接收到的数据:{data}</span>}</Consumer>)}
}ReactDOM.render(<Person />, document.getElementById('root'))

React React组件之间的通信方式相关推荐

  1. React(5)React兄弟组件之间的通信

    文章目录 前言 一.兄弟组件之间的通信原理 二.三个组件的基本结构 1.子组件ColorSelector的基本结构 2.子组件ColorBoard的基本结构 3.父组件Color的基本结构 三.Col ...

  2. react兄弟组件之间的传值

    react兄弟组件之间的传值 一.通过redux 1.在redux中找到对应的文件设置 a. b. c. d. 2.页面存储数据到redux中 3.页面提取redux里面的数据 二.通过hook中的c ...

  3. VUE中组件之间的通信方式

    目录 一.父子组件之间的通信方式 1.props+$emit() 3.$parent+$children 4.provide+inject 5.$attrs+$listeners 6.ref+$ref ...

  4. React兄弟组件之间通信

    兄弟组件之间通信 React是只有单项数据流动模式,也就是只能父组件的数据传递给子组件,而没有办法将子组件的数据传递给父组件.那么如果想要两个子兄弟组件通信该怎么办呢? 答案是可以通过子组件向父组件推 ...

  5. vue各组件之间多种通信方式

    重点:vue的两大特性是响应式编程和组件化.组件(Component)是 Vue 最核心的功能,但是各个组件实例的作用域是相互独立的,这表明不同组件之间的数据是无法直接相互引用的.如果想要跨组件引用数 ...

  6. react 父子组件之间相互传值

    From: https://blog.csdn.net/luzhaopan/article/details/85003362 1.定义父组件 import React, { PureComponent ...

  7. react父子组件之间的传值

    父传子------------- 父组件 constructor(props){super(props)this.state={message:"我是父组件传来的"} }rende ...

  8. React的组件中的传值,及context上下文的使用

    React的组件之间互相传值 父子组件传值 兄弟组件传值 上下文context 父子组件传值 react 中父组件可以将数据作为子组件的属性进行传值,子组件通过 props 属性接收值. 父组件可以监 ...

  9. 「后端小伙伴来学前端了」Vue中利用全局事件总线实现组件之间通信

    月亮啊月亮 你能照见南边,也能照见北边 照见她,你跟她说一声,就说我想她了. 前言 前一篇文章写了 vue 中利用 Props 实现组件之间的通信,那种方式是最简单也是最基础的组件之间的通信方式.父组 ...

  10. vue组件之间通信(传值)---8种方式

    Vue组件之间的通信方式(个人理解) props(父传子) //父组件 parent.vue<template>//子组件<child-com :num="num" ...

最新文章

  1. 『参考』.net CF组件编程(4)——为自定义组件添加工具箱图标!
  2. 操作所有的数据库免费可视化界面靠它就够了,告别付费,告别白嫖,卸载Navicat!
  3. android c#websocket传送图片
  4. cisco 2960 VLAN MAC_思科交换机交换机中ip、mac地址绑定
  5. 【科普】OSS存储的基本操作
  6. [转帖]Ubuntu 对应内核版本
  7. 【VC++技术杂谈005】如何与程控仪器通过GPIB接口进行通信
  8. 2.4 理解指数加权平均
  9. sql 查询目标数据库中所有的表以其关键信息
  10. MapXtreme 2005 学习心得 第八节Session问题澄清-两种配置方式致开发方式不同(九)...
  11. C语言malloc函数
  12. WIN7英文操作系统,中文语言包安装。及部分开发环境,软件中文乱码问题解决。
  13. (SQL)使用Excel连接数据库
  14. USB设备无法识别的五大原因
  15. ios睡眠分析 卧床 睡眠_使用Swift在HealthKit中进行睡眠分析
  16. NVIDIA Tegra3,高通S4 MSM8960,三星Exynos4【新一代手机处理器大比拼】
  17. getvod.php_飞飞影视系统飞飞cms2.8标签大集合
  18. excel单元格内加空格_如何将Excel一个单元格中空格隔开的内容在不同单元格显示...
  19. crash日志学习(初步)
  20. MD 的图片格式排版偏差的问题

热门文章

  1. 计算机病毒查杀记录,如何看eset nod32防病毒查杀历史记录?
  2. 各类dp的总结+例题
  3. 2021/10/04 git 详细流程
  4. SpringBoot整合Docker实现一次构建到处运行
  5. java中int型的取值范围_Java中int的取值范围
  6. cmd命令行怎样运行python,在CMD命令行中运行python脚本的方法
  7. 常见的计算机查询语言,利用SQL语句查询SCCM常用报表
  8. 【MySQL】MySQL安装图解
  9. 运动会加油稿计算机学院150字,学校运动会加油稿150字5篇
  10. 手机连接不上电脑的移动热点ip配置失败