React:组件传参

16 篇文章 0 订阅
一、父传子
1. props传参
// 1. 类式组件
class ComC extends React.Component {
	render() {
		return (
			{/* 类式组件通过 `this.props.xx`获取参数 */}
			<div>{this.props.title}</div> 
		)
	}
}

// 2.函数式组件
function ComF(props) {
	return (
		// 函数式组件,通过 函数入参 传递参数
		<div>{props.title}</div>
	)
}

class App extends React.Component {
	render (){
		return (
			<ComC title="这是类式组件"/>
			<ComF title="这是函数式组件"/>
		)
	}
}
props说明

1. props是只读对象(readOnly)
根据单向数据流的要求,子组件只能读取props的数据,不能修改。

2. props可以传递任意数据
数字、字符串、数组、对象、布尔、函数、jsx

function Son(props) {
	cosnt {list, obj, jsxObj} = props; //解构
	return (
		{/*
			<div>
				{props.list.map(item => (
					<p key="item">{item}</p>
				))}
				<p>{props.obj.name}</p>
				{props.jsxObj}
			</div>
			*/}
			{/*支持解构*/}
			<div>
				{this.props.list.map(item => (
					<p key="item">{item}</p>
				))}
				<p>{this.props.obj.name}</p>
				{this.props.jsxObj}
			</div>
	)
}

class App extends React.Component {
	state = {
		list:[1,2,3],
		obj:{
			name: "李白",
			age: 1200
		}	}
	render (){
		return (
			<Son 
				list={this.state.list}
				obj={this.state.obj}
				jsxObj="<span>这是传递的jsx对象</span>"
				/>
		)
	}
}
二、子传父

子组件调用父组件传递过来的函数,将要传递的数据作为实参传入该函数即可。

function Son(props){
	const {handler} = props;

	return (
		<button onClick={() => handler('子组件传递给父组件的值')}></button>
	)
}

class App extends React.Component {
	handler = (text) => {
		console.log(text);
	}
	
	render(){
		return (
			<Son handler={handler} />
		)
	}
}
三、兄弟组件通信

核心思路:利用状态提升机制,通过共同的父组件 实现兄弟通信
在这里插入图片描述
步骤:
先把B中的数据通过 子传父 传给 App;
再把App 中的数据通过 父传子 传给 A

function SonA(props) {
	return (
		<div>this is {props.sendAMsg}</div>
	)
}

function SonB(props) {
	const {sendBMsg} = props;

	return (
		<div>B send to A <button onClick={() => sendBMsg('来自B的数据')}>点击传值</button></div>
	)
}

class App extends React.Component {
	state = {
		sendAMsg:""
	}

	sendBMsg = (val) =>{
		this.setState({
			sendAMsg: val
		})
	}

	render(){
		return (
			<div>
				<SonA sendAMsg={this.state.sendAMsg} />
				<SonB sendBMsg={sendBMsg} />
		)
	}
}
四、跨组件通信 Context

在这里插入图片描述
实现步骤:

1. 类组件

1.创建 Context实例,导出 Provider、Consumer对象

const {Provider, Consumer} = createContext();

2.使用 Provider 包裹根组件,通过 value 提供数据

<Provider value={this.state.msg}>
	{/*根组件*/}
</Provider>

3.使用Consumer 包裹使用数据的组件,获取数据

<Consumer>
	{value => /* 基于context 的值进行渲染*/}
</Consumer>

实例:

import React, {createContext} from "react";
// 组件 App -> A -> C
// App数据 -> C
// 1.导出 Provider、Consumer 两对象
const {Provider, Consumer} = createContext();

function ComC() {
	return (
		<div>
			this is ComC
			{/*3. 通过 Consumer 使用数据*/}
			<Consumer>
				{value => (<p>{value}</p>)}
			</Consumer>
		</div>
	)
}

function ComA() {
	return (
		<div>
			this is ComA
			<ComC />
		</div>
	)
}

class App extends React.Component {
	state = {
		msg: "this is message"
	}

	render () {
		return (
			<Provider value={this.state.msg}>
			{/*2.使用Provider 包裹根组件*/}
				<div>
					<ComA />
				</div>
			</Provider>
		)
	}
}
2. 函数组件
  1. 使用 createContext 创建 Context 对象
  2. 在顶层组件通过 Provider 提供数据
  3. 在底层组件通过useContext 函数获取数据

代码示例:

import React, {useState, createContext, useContext} from "react";

// 1. 通过createContext 构造 Context 对象
const Context = createContext();

function SonB() {
  const count = useContext(Context);

  return (
    <div>
      This is SonB, count is {count}
    </div>
  )
}

function SonA() {
  // 3.在底层组件中使用 useContext() 获取数据
  const count = useContext(Context);

  return (
    <div>
      This is SonA, count is {count}
      <SonB></SonB>
    </div>
  )
}

function App() {
  const [count, setCount] = useState(10);

  return (
    <Context.Provider value={count}>
      {/* 2.在顶层组件使用 Context.Provider 提供数据 */}
      <div>
        <button onClick={() => setCount(100)}>change{count}</button>
        <SonA ></SonA>
      </div>
    </Context.Provider>
  )
}

注意
1.如果Context 需要传递数据并且将来还需要再对数据做修改,底层组件也需要一起改变时,如上示例 写在app.js中
2. Context 如果要传递的数据 只需在整个应用初始化的时候传递一次,可以选择在最外层 index.js 中做数据提供

// index.js
ReactDOM.render(
	<React.StrictMode>
		<Context.Provider value="10">
			<App />
		</Context.Provider>
	<React.StrictMode>
)
五、特殊的 Children

Children 表示该组件的子节点,只有组件有子节点,props中有该属性。

Children 可以是什么?
1.普通文本
2.普通标签
3.函数
4.jsx

import React from "react";

function Son(props) {
  const {children} = props;
  children();

  return (
    <div>
      this is Son.
      {/* <div>{children}</div> */}
    </div>
  )
}
class App extends React.Component {
  render() {
    return (
      <>
        {/* <Son >this is Children.</Son>
        <Son>{<p>this is P.</p>}</Son> */}
        {/* 传递函数 */}
        <Son>{() => console.log(1111)}</Son>
      </>
    )
  }
}

export default App;
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端卡卡西呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值