react组件通信的方式

父子组件通信

父子通信
父组件向子组件传值,通过 props的方式,在子组件身上绑定一个自定义属性将值传递给子组件
子组件向父组件传值,也是通过 props的方式,在子组件身上绑定一个自定义属性并将可以修改父组件状态的函数传递给子组件,
然后子组件通过调用这个函数就可以将值传递给父组件

父组件 
import { useState } from 'react'
import Son from './son'
const Father2 = () => {
  const [count, setCount] = useState(0)
  return (
    <>
      <div>Father组件</div>
      <div>count: {count}</div>
      <Son count={count} setCount={setCount} />
    </>
  )
}
export default Father2

子组件
const Son = ({ count, setCount }: { count: number; setCount: (count: number | ((arg: number) => number)) => void }) => {
  return (
    <>
      <div>Son组件</div>
      <div>从父组件拿来的count值: {count}</div>
      <button onClick={() => setCount(count + 100)}>count + 100</button>
    </>
  )
}
export default Son
兄弟组件或非嵌套组件通信

可以使用发布订阅的方法(使用第三方插件 pubsub),在其中一个兄弟组件发布一个自定义事件并携带值,在另一个兄弟组件中订阅这个事件并通过回调函数拿到传过来的值

Brother1组件
import PubSub from 'pubsub-js'
import { useEffect, useState } from 'react'
const Brother1 = () => {
  const [count, setCount] = useState(0)
  useEffect(() => {
  // 订阅 value 事件
    PubSub.subscribe('value', (msg: string, value: number) => {
      setCount(value)
    })
  }, [])
  return (
    <>
      <div>brother1</div>
      <div>接收到brother2组件传来的值:{count} </div>
    </>
  )
}
export default Brother1

Brother2组件
import PubSub from 'pubsub-js'
const Brother2 = () => {
  const handleClick = () => {
  // 发布 value 事件
    PubSub.publish('value', 100)
  }
  return (
    <>
      <div>brother2</div>
      <button onClick={handleClick}>100给brother1组件</button>
    </>
  )
}
export default Brother2
跨级组件(祖孙)通信

使用 useContext hook

Father3组件
import Son1 from './son1'
import { createContext, useState } from 'react'
export const CountContext = createContext(0)
const Father3 = () => {
  const [count, setCount] = useState(100)
  return (
    <>
      <div>Father3</div>
      <CountContext.Provider value={count}>
        <Son1 />
      </CountContext.Provider>
    </>
  )
}
export default Father3
Son1组件
import Son2 from './son2'
const Son1 = () => {
  return (
    <>
      <div>Son1</div>
      <Son2 />
    </>
  )
}
export default Son1
Son2组件
import { useContext } from 'react'
import { CountContext } from './index'
const Son2 = () => {
  const count = useContext(CountContext)
  return <div>Son2组件拿到Father3的count: {count}</div>
}
export default Son2
所有组件共享

全局状态管理工具:借助redux和mobx进行通信,这种工具会维护一个全局状态,并集中管理这个状态

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值