React组件传值(跨级组件)

通过 context 实现

第一种方式:

祖先组件

1. 创建Context,结构出我们需要的Provider(供应方)和Consumer(消费方)

const { Provider, Consumer } = React.createContext()

2. 导出Consumer

export { Consumer }

3. Provider包裹根元素(这样Provider就是最大的根元素) ,这里Right组件里面又引入了一个子组件RightSon

render() {
    return (
      // 3. Provider包裹根元素
      <Provider value={this.state.color}>
        <div>
          <Right></Right>
        </div>
      </Provider>
    )
  }

子孙组件

消费者,要使用Consumer进行消费(Consumer里面必须要是一个函数,且必须有返回值)

1. 导入Consumer

import { Consumer } from '../App'

2. 进行使用

render() {
    return (
      <div>
        <Consumer>{(value) => <div>RightSon---{value}</div>}</Consumer>
      </div>
    )
  }

第二种方式:

类似于vue2的时间总线EventBus

1. 单独创建一个js文件,不管是供应还是消费,都需要引入这个共同的文件(这样确保使用的是同一个实例)

import { createContext } from 'react'

const myContext = createContext()

export default myContext

2. 供应方,祖先组件提供数据(Son组件里面引入了Grandson组件)

import React, { useState } from 'react'
import Son from './pages/Son/Son.js'
import myContext from './utils/Context.js'

export default function App() {
  let [msg, setMsg] = useState('信息')
  return (
    <div className="App">
      <myContext.Provider value={msg}>
        <Son></Son>
      </myContext.Provider>
    </div>
  )
}

3. 消费方,子孙组件消费数据

import React from 'react'
import myContext from '../../utils/Context.js'

export default function Grandson() {
  return (
    <div>
      <h2>Grandson</h2>
      <myContext.Consumer>
        {(val) => {
          console.log(val)
          return '祖先组件传过来的值是:' + val
        }}
      </myContext.Consumer>
    </div>
  )
}

useContext()的使用

  • 简化了Consumer(消费方)这步,可以直接替代Consumer

useContext(context实例对象)   只有一个参数,参数必须是一个context对象。返回值是Provide(提供方)的value值

举例

import React, { useContext } from 'react'
import myContext from '../../utils/Context.js'

export default function Grandson() {
  const value = useContext(myContext)
  // console.log(value)
  return (
    <div>
      <h2>Grandson</h2>

      {/* <myContext.Consumer>
        {(val) => {
          console.log(val)
          return '祖先组件传过来的值是:' + val
        }}
      </myContext.Consumer> */}

      {/* 上面的可以被useContext()替代 */}
      <strong>{value}</strong>
    </div>
  )
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值