React跨组件通信

React 组件中的通信分为三种,必须依赖React.createContext()

const myContext = React.createContext()

 

1、通过标签<Consumer>

2、通过useContext(myContext)

3、通过static contextType = myContext

import React, { Component, useContext } from 'react'
import { Button } from 'antd'

const myContext = React.createContext()
const { Provider, Consumer } = myContext
const sayHai = (name) => {
  console.log(`${name} say hai!`)
}
// function App(props) {
//   console.log('App:', props)
//   return (
//     <button onClick={() => props.say(props.name)}>{props.name}</button>
//   )
// }

// function App2(props) {
//   const ctx = useContext(myContext)
//   return (
//     <button onClick={() => ctx.say(`${ctx.name} App2`)}>{ctx.name}</button>
//   )
// }
// class App3 extends Component {
//   static contextType = myContext
//   render() {
//     return (
//       <button onClick={() => this.context.say(`${this.context.name} App3`)}>{this.context.name}</button>
//     )
//   }
// }
// class ContextTest extends Component {
//   render() {
//     return (
//       <Provider value={{ name: '张三', say: sayHai }}>
//         <Consumer>
//           { (value) => <App {...value}></App>}
//         </Consumer>
//         <App2></App2>
//         <App3></App3>
//       </Provider>
//     )
//   }
// }
// export default ContextTest
function App(Com) {
  return (props) => (
    // 必须写value
    <Provider value={{name: '老五', say: sayHai}}>
      <Com {...props}/>
    </Provider>
  )
}

class ContextTest extends Component {
  render() {
    return (
      <Consumer>
        {/* consumer必须是函数 */}
        {value => <button onClick={() => value.say(value.name)}>{value.name}</button>}
      </Consumer>
    )
  }
}

export default App(ContextTest)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值