react-组件间的通讯

一、父传子

  • 父组件在使用子组件时,提供要传递的数据
  • 子组件通过props接收数据
javascript 复制代码
class Parent extends React.Component {
	render() {
		return (
			<div>
				<div>我是父组件</div>
				<Child name="张" age={16} />
			</div>
		)
	}
}
javascript 复制代码
const Child = props => {
	return (
		<div>
			<div>我是子组件</div>
			<div>
				从父组件接收来的数据: {props.name}-{props.age}
			</div>
		</div>
	)
}

二、子传父

  • 父组件在使用子组件时,提供一个回调函数,用于接收数据
  • 子组件通过props调用回调函数,将要传递的数据作为参数传递给回调函数
javascript 复制代码
class Parent extends React.Component {
    getChildMsg = (msg) => {
        console.log('从子组件接收来的数据:', msg)
    }
	render() {
		return (
			<div>
				<div>我是父组件</div>
				<Child getMsg={this.getChildMsg} />
			</div>
		)
	}
}
javascript 复制代码
const Child = props => {
    handleClick = (msg) => {
        this.props.getMsg('123abc')
    }
	return (
		<div>
			<div>我是子组件</div>
			<button onClick={this.handleClick}>
				点我,给父组件传递数据
			</button>
		</div>
	)
}

三、无关组件通讯

  • 调用 React.createContext() 创建 Provider 和 Consumer 两个组件
  • 使用Provider 组件作为父节点,设置value属性,表示要传递的数据
  • 调用Consumer 组件接受数据
javascript 复制代码
import React from 'react'
const { Provider, Consumer } = React.createContext()

class Parent extends React.Component {
	render() {
		return (
			<Provider value="red">
				<div>
					我是Parent 
					<Child />
				</div>
			</Provider>
		)
	}
}

const Child = props => {
	return (
		<div>
			我是Child
			<Grandson />
		</div>
	)
}


const Grandson= props => {
	return (
		<div>
			我是Grandson
			<Consumer>{data => 我是Parent接收来的数据: {data}}</Consumer>
		</div>
	)
}

export default Parent 

四、组件间的通讯demo

  • 代码
javascript 复制代码
import React from 'react'
import './index.css'

import PropTypes from 'prop-types'

/**
 * 组件间的通信demo
 */

// 创建context得到提供和消费两个组件,方便无关组件之间的通信
// Provider设置value属性,表示要传递的数据
// Consumer接收数据
const { Provider, Consumer } = React.createContext()

class Communication extends React.Component {
	render() {
		return (
			<Provider value="red">
				<div className="first">
					我是first
					<Node name="张" age={16} />
				</div>
			</Provider>
		)
	}
}

const Node = props => {
	return (
		<div className="second">
			<div>我是second-Node</div>
			<div>
				父组件first接收来的数据: {props.name}-{props.age}
			</div>
			<SubNode
				getMsg={msg => {
					console.log('second-Node接收到子组件third-SubNode数据:', msg)
				}}
			/>
		</div>
	)
}

// Node组件 添加props校验
Node.propTypes = {
	name: PropTypes.string.isRequired, // string类型,必填
	age: PropTypes.number, // number类型
}

// Node组件 添加props默认值
Node.defaultProps = {
	age: 18,
}

const SubNode = props => {
	return (
		<div className="third">
			<div>我是third-SubNode</div>
			<button
				onClick={() => {
					props.getMsg('三儿')
				}}>
				点我给父组件second-Node传值
			</button>
			<Child>我是子节点</Child>
		</div>
	)
}

const Child = props => {
	return (
		<div className="fourth">
			<div>我是fourth-Child</div>
			<Consumer>{data => <span>我是first接收来的数据: {data}</span>}</Consumer>
			<div>组件标签的子节点:{props.children}</div>
		</div>
	)
}

export default Communication
  • 效果
  • 输出
相关推荐
M_emory_24 分钟前
解决 git clone 出现:Failed to connect to 127.0.0.1 port 1080: Connection refused 错误
前端·vue.js·git
Ciito27 分钟前
vue项目使用eslint+prettier管理项目格式化
前端·javascript·vue.js
成都被卷死的程序员1 小时前
响应式网页设计--html
前端·html
fighting ~1 小时前
react17安装html-react-parser运行报错记录
javascript·react.js·html
老码沉思录1 小时前
React Native 全栈开发实战班 - 列表与滚动视图
javascript·react native·react.js
abments1 小时前
JavaScript逆向爬虫教程-------基础篇之常用的编码与加密介绍(python和js实现)
javascript·爬虫·python
mon_star°1 小时前
将答题成绩排行榜数据通过前端生成excel的方式实现导出下载功能
前端·excel
Zrf21913184551 小时前
前端笔试中oj算法题的解法模版
前端·readline·oj算法
老码沉思录2 小时前
React Native 全栈开发实战班 - 状态管理入门(Context API)
javascript·react native·react.js
文军的烹饪实验室3 小时前
ValueError: Circular reference detected
开发语言·前端·javascript