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
  • 效果
  • 输出
相关推荐
其美杰布-富贵-李8 分钟前
03 ref、reactive 与 computed 响应式数据
前端·javascript·vue.js
OpenTiny社区10 分钟前
GenUI SDK v1.3.0 发布|多框架兼容,一键换物料,渲染器 & 演练场全面增强!
前端·ai编程
用户9385156350711 分钟前
useRef + Web Worker 实战:React 如何优雅地拥抱多线程
前端·javascript·react.js
嘟嘟071726 分钟前
useRef + Web Worker:React 中的耗时计算不卡页面
javascript·vue.js
mONESY28 分钟前
React Router v7 完全实战指南:从入门到鉴权,一套代码全搞定
javascript
他们叫我秃子34 分钟前
前端开发转 Go 全栈(五):终于遇到熟人了,Go 的闭包和高阶函数原来这么像 JavaScript
前端·后端·go
用户615958680002236 分钟前
从 0 写一个迷你 wujie:用原生 Web API 实现微前端
前端
妙码生花36 分钟前
从 PHP 到 AI + Golang,程序员自救转型手记(五十七):AI时代对组件封装的新理解、agInput 统一入口,动态表单预备
前端·后端·go
fairyly38 分钟前
接手新项目不用硬啃源码,我的 TRAE Work 快速上手实战工作流
前端·ai编程·trae
搬砖记录员39 分钟前
用 PyAutoGUI 手搓录屏"老板键":从原理到四套可跑源码,附工程化落地思考
前端