react父子组件传值

父传子–通过props接收,不能修改props的值,props可以设置默认值函数组件直接在传参时写默认值,类组件在组件内定义static defaultProps设置props默认值

插槽使用props.chidren就能接受到父组件传递的html标签内容

function father() {
  let list = 'zhangsan'
  return (
    <>
    	//index 就为props传的给SonF的chidren值也可以传递<div></div>
        <SonF>index</SonF>
    </>
  )
}

prop传递校验借用第三方包propTypes–也可直接使用TS

SonF.PropTypes = {
	list: PropTypes.String//设置list为string类型
}
function father() {
  let list = 'zhangsan'
  return (
    <>
        <SonF list={list}>index</SonF>
	    <SonC list={list}>index</SonC>
    </>
  )
}

//函数子组件
function SonF(props) {
  return (
    <>
	    <div>函数子组件</div>
	    <div>{props.list}</div>
    </>
  )
}

//类子组件
class SonC extends Component {
  render() {
	return (
    <>
	    <div>类子组件</div>
	    <div>{this.props.list}</div>
    </>
	)
  }
}

子传父

import React, { Component, useState } from 'react'

function Father() {
  let [list, setList] = useState('zhangsan')
  let getSonList1 = (value)=>{
  	console.log(value,'子组件传递的值')
  }
  return (
    <>
      <SonF getSonList={(e)=>getSonList1(e)}>index</SonF>
	    <SonC getSonList={(e)=>getSonList1(e)}>index</SonC>
    </>
  )
}

//函数子组件
function SonF(props) {
  let [listSon, setListSon] = useState('zhangsanSon')
  return (
    <>
	    <div>函数子组件</div>
	    <div onClick={()=>{props.getSonList(listSon)}}>传值给父组件</div>
    </>
  )
}

//类子组件
class SonC extends Component {
  state = {
    listSon:"张三"
  }
  render() {
	return (
    <>
	    <div>类子组件</div>
	    <div>{this.props.list}</div>
	    <div onClick={()=>{this.props.getSonList(this.state.listSon)}}>传值给父组件</div>
    </>
	)
  }
}

兄弟传值–通过父组件传递–SonF传递数据给Father再由Father传递给SonC

function Father() {
  let [list, setList] = useState('zhangsan')
  let getSonList1 = (value)=>{
  	setList(value)
  }
  return (
    <>
      <SonF getSonList={(e)=>getSonList1(e)}>index</SonF>
	    <SonC list={list}>index</SonC>
    </>
  )
}

//函数子组件
function SonF(props) {
  let [listSon, setListSon] = useState('zhangsanSon')
  return (
    <>
	    <div>函数子组件</div>
	    <div onClick={()=>{props.getSonList(listSon)}}>传值给父组件</div>
    </>
  )
}

//类子组件
class SonC extends Component {
  state = {
    listSon:"张三"
  }
  render() {
	return (
    <>
	    <div>类子组件</div>
	    <div>{this.props.list}</div>
    </>
	)
  }
}

兄弟传值–使用events进行传递,emit进行传值,on进行接收

import React, { Component, useState } from 'react'

import {EventEmitter} from 'events'

const bus = new EventEmitter()

function Father() {
  return (
    <>
      <SonF>index</SonF>
	  <SonC>index</SonC>
    </>
  )
}

//函数子组件
function SonF() {
  let transfer = ()=>{
    bus.emit('SonfValue',{
      value:"zhagnsanSonF"
    })
  }
  return (
    <>
	    <div>函数子组件</div>
	    <div onClick={()=>{transfer()}}>传值给兄弟组件</div>
    </>
  )
}

//类子组件
class SonC extends Component {
  state = {
    listSon:"张三"
  }
  componentDidMount(){
    //接收brother2传来的值
    bus.on('SonfValue',data=>{
        this.setState({listSon:data.value})
    })
  }
  render() {
	return (
    <>
	    <div>类子组件</div>
	    <div>{this.state.listSon}</div>
    </>
	)
  }
}

父组件传递子孙组价–prop层层传递或者使用context-若组件不在一个文件内需把context提到一个js文件中,需要时引入

import React, { Component, createContext, useContext } from 'react'

let context = createContext()

function Father() {
  let value = 'fater'
  return (
    <context.Provider value={value}>
      <SonF>index</SonF>
    </context.Provider>
  )
}

//函数子组件
function SonF() {
  const contextSon = useContext(context)
  return (
    <>
      <div>{contextSon}</div>
      <SonC></SonC>
    </>
  )
}

//类子组件
class SonC extends Component {
  render() {
    return (
      <context.Consumer>
        {
          (value) => {
            return <>
              <div>孙子组件</div>
              <div>{value}</div>
            </>
          }
        }
      </context.Consumer>
    )
  }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值