charlesliu
V2EX  ›  React

React 有什么比较优雅的跨组件通信方法吗

  •  
  •   charlesliu · Feb 16, 2022 · 6989 views
    This topic created in 1722 days ago, the information mentioned may be changed or developed.
    在 A 组件上推送了某个消息,可以让不同级的组件 B 监听,并执行相应的任务。

    我首先想到了使用 Context ,保存一个变量,A 改变这个变量,B 使用 useEffect 监听变化。

    或者是使用 hox.js

    或者是使用 浏览器的 CustomEvent 。

    上述感觉都不够优雅
    37 replies  •  2022-02-17 21:01:00 +08:00
    WildCat
    WildCat
    Feb 16, 2022
    1
    Redux?
    tatu
    tatu
    Feb 16, 2022
    2
    rxjs?
    seki
    seki
    Feb 16, 2022❤️1
    3
    思路很多,比如
    + 加一个 event emitter
    + 加入 store
    + rxjs

    就看你为什么会觉得不优雅了
    ddiu8081
    ddiu8081
    Feb 16, 2022 via iPhone
    4
    Recoil? A 组件 set ,B 组件 useValve
    rrfeng
    rrfeng
    Feb 16, 2022 via Android❤️5
    5
    这时候 angular 的方便就体现出来了!可以直接通过 service 发布 /订阅 事件,跨多远都没关系。
    hanai
    hanai
    Feb 16, 2022
    6
    event bus
    postMessage
    Rocketer
    Rocketer
    Feb 16, 2022 via iPhone
    7
    angular 是用 rxjs 实现的,你也可以在 react 里使用 rxjs 。只是 angular 全面使用 rxjs 而 react 会有很多 promise ,混着写算不算另一种不优雅?
    theohateonion
    theohateonion
    Feb 16, 2022
    8
    为什么不够优雅呢?你觉得优雅的方式是什么呢? Context + useEffect 就是一个简单的 pubsub ,不过缺乏统一的地方去管理这些订阅,可能是个问题。
    solos
    solos
    Feb 16, 2022
    9
    @rrfeng angular 真香
    Leviathann
    Leviathann
    Feb 16, 2022
    10
    react 比较推崇单向数据流 单一信源
    所以就弄个 store
    sweetcola
    sweetcola
    Feb 17, 2022
    11
    可能你是觉得都用到了 Context (要写 Provider )不够优雅吗?

    看看 https://www.npmjs.com/package/react-signal-slot 这个符不符合你的想法,就是个不用写 Provider 的 event bus
    dayeye2006199
    dayeye2006199
    Feb 17, 2022
    12
    context 不用引入额外依赖,多好
    xsen
    xsen
    Feb 17, 2022
    13
    封装个 event bus ,这样不管是 react 组件、还是纯 js/ts 模块,都可以双向通讯
    跨 ui 框架了,还可以服用
    fliu2476
    fliu2476
    Feb 17, 2022
    14
    zustand 香的不行
    fancy2020
    fancy2020
    Feb 17, 2022
    15
    redux?
    gouflv
    gouflv
    Feb 17, 2022 via iPhone
    16
    提问前,请先自己定义好什么样叫优雅
    boxz
    boxz
    Feb 17, 2022
    17
    jotai
    Latin
    Latin
    Feb 17, 2022
    18
    useContext or Redux
    karott7
    karott7
    Feb 17, 2022
    19
    Redux 就好了
    ChefIsAwesome
    ChefIsAwesome
    Feb 17, 2022
    20
    有一种“优雅”是必须用一个技术栈内的方案解决问题。
    另外一种“优雅”是融会贯通,跳出当前技术栈,从更广的范围内,找到最简单的方案解决问题。
    明显你这就是个常规小问题,怎么解决还不是看你心情。
    Hanggi
    Hanggi
    Feb 17, 2022
    21
    有人提到 Angular , 确实在有大量数据操作的场景里,Angular 很简单很方便。

    跨组件状态共享,最传统的方法就是引入 Redux ,但是需要一点学习成本,且代码量会变多不少。好处就 i 是熟悉了之后可以进行统一的状态管理。

    个人比较推荐 Recoil ,使用起来非常简单高效,而且性能也很好。
    CodingNaux
    CodingNaux
    Feb 17, 2022
    22
    既然是消息,那就使用订阅发布吧,custom event 之类可以呀,如果是一个简单的页面,怎么简单怎么来
    不是什么数据都要放 redux ,也不是什么情况都需要 redux
    rxjs 有点成本
    einq7
    einq7
    Feb 17, 2022
    23
    useContext 结合 useReducer
    charlesliu
    charlesliu
    OP
    Feb 17, 2022
    25
    这确实是一个很小的 case ,不过也是因为小,就没有什么比较统一的方案,就感觉自己的实现方法不够简洁、通用,所以才来 v 站上咨询一下,开阔视野。

    如果是我个人的话,我也倾向于使用 rxjs ,不过在公司项目中这样使用,不见得引入它是个好的选择。

    感谢各位回答
    charlie21
    charlie21
    Feb 17, 2022
    26
    useEffect 官网示例 开销最小做法
    https://zh-hans.reactjs.org/docs/hooks-effect.html

    关于何为优雅
    https://www.zhihu.com/question/47161776/answer/111488644#人们怎么编程: 先为对应的问题建立一个模型, 然后用代码设计出一套 DSL, 再将代码进行运算以解决问题。也就是 越符合你自己在脑海之中建立的模型,你就会觉得越优雅。这是你一个人的事,而这往往和你自己对问题的定义有关,而和问题的实际规模无关。相比优雅,对别人以优雅之名给杀鸡人推荐杀牛刀的警惕是更必要的
    AyaseEri
    AyaseEri
    Feb 17, 2022
    27
    dispatchEvent
    addEventListener
    Incrus
    Incrus
    Feb 17, 2022 via iPhone
    28
    Mobx
    star7th
    star7th
    Feb 17, 2022
    29
    强烈推荐 Mobx https://cn.mobx.js.org/
    freedomT
    freedomT
    Feb 17, 2022❤️1
    30
    mitt
    a935855375
    a935855375
    Feb 17, 2022
    31
    Angular 通过 EventEmitter 。 可以搞个类似的 EventBus 服务
    linl1n
    linl1n
    Feb 17, 2022 via iPhone
    32
    安利 Mobx
    code4you
    code4you
    Feb 17, 2022
    33
    Mobx +1
    flashback313
    flashback313
    Feb 17, 2022
    34
    Context 其实就是你要的答案,其他都是 pubsub 类
    litmusF
    litmusF
    Feb 17, 2022 via Android
    35
    concent.js
    mxT52CRuqR6o5
    mxT52CRuqR6o5
    Feb 17, 2022
    36
    如果是希望减少外部依赖的话,那就 context 或者 props 硬传
    Cbdy
    Cbdy
    Feb 17, 2022
    37
    document.dispatchEvent
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1761 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 103ms · UTC 17:20 · PVG 01:20 · LAX 09:20 · JFK 12:20
    ♥ Do have faith in what you're doing.