xrr2016
V2EX  ›  React

如何解决 React 中组件传递方法链路很长的问题?

  •  
  •   xrr2016 ·
    xrr2016 · Jul 14, 2021 · 4988 views
    This topic created in 1941 days ago, the information mentioned may be changed or developed.

    一个组件 A 的方法通过 props 传递到组件 B 然后到组件 C 再到 D 再到 E...

    这样的写法找起来真是痛苦啊,所以如何解决这种问题呢?

    网上搜了一圈没找到方案,所以来问下哈哈哈

    31 replies  •  2021-07-16 05:34:06 +08:00
    Puteulanus
    Puteulanus
    Jul 14, 2021❤️2
    1
    用 context ?
    P233
    P233
    Jul 14, 2021
    2
    context
    fengfuliu
    fengfuliu
    Jul 14, 2021
    3
    context 或者状态管理库
    qingzhan
    qingzhan
    Jul 14, 2021
    4
    试试这个? /t/786936
    HALOZ
    HALOZ
    Jul 14, 2021
    5
    方法很多,context 、redux 、发布-订阅模式、甚至 session
    gxm44
    gxm44
    Jul 14, 2021
    6
    state management or context
    zhuweiyou
    zhuweiyou
    Jul 14, 2021
    7
    状态管理 或 pub-sub
    Leviathann
    Leviathann
    Jul 14, 2021 via iPhone
    8
    我试过 context,可以解决
    然后 review 不给过,说 context 不好控制。。
    xrr2016
    xrr2016
    OP
    Jul 14, 2021
    9
    好的,试试 context
    KuroNekoFan
    KuroNekoFan
    Jul 14, 2021
    10
    context 挺好的
    Cuo
    Cuo
    Jul 14, 2021 via iPhone
    11
    Redux
    newbieRenew
    newbieRenew
    Jul 14, 2021 via iPhone
    12
    直接 Redux 了,全局更新,不用管传来传去。
    xrr2016
    xrr2016
    OP
    Jul 14, 2021
    13
    @Leviathann 为啥不好控制?
    xwchenhui
    xwchenhui
    Jul 14, 2021
    14
    @HALOZ #5 session 还行,走位风骚
    Imindzzz
    Imindzzz
    PRO
    Jul 14, 2021
    15
    你需要一个状态管理插件,以前我用 redux mobx 。
    react 16 推出 hooks 后我使用 https://github.com/jamiebuilds/unstated-next/blob/master/README-zh-cn.md

    readme 的指南部分,有介绍这个库的设计思路,就是用简单封装一下 react 的 context api
    musi
    musi
    Jul 14, 2021
    16
    window (狗头)
    shakukansp
    shakukansp
    Jul 14, 2021
    17
    let fn = () => {}

    const useYourFN = () => {
    const [localFn, setLocalFn] = useState(fn)

    return {
    localFn,
    setLocalFn
    }
    }
    shakukansp
    shakukansp
    Jul 14, 2021
    18
    @shakukansp 漏了 setLocalFn 外面再套一层设置外部 fn 的方法再 return
    susumail
    susumail
    Jul 14, 2021 via iPhone
    19
    context
    JerryCha
    JerryCha
    Jul 14, 2021
    20
    建议 redux,context 有重渲染的坑
    frankwei777
    frankwei777
    Jul 14, 2021
    21
    有大佬讲下 context 有什么坑吗 写了 2 年 react 都没咋用过
    Hanggi
    Hanggi
    Jul 14, 2021
    22
    redux 有点啰嗦,竟然没有人提 Recoil 。
    fantastic
    fantastic
    Jul 14, 2021
    23
    Dva 走起
    zinete
    zinete
    Jul 14, 2021
    24
    mobx 走起
    Rocketer
    Rocketer
    Jul 15, 2021 via iPhone
    25
    别给新人推荐 redux 了,真的太重了,无论开发速度还是运行速度都慢。context 足够 99%的正常使用了,新人一般没机会遇上那 1%的坑。
    rioshikelong121
    rioshikelong121
    Jul 15, 2021❤️2
    26
    这种现象叫 Prop Drilling, 指的是在组件树中,父组件不得不往下传递某些 props 给子组件,但是其本身并不需要使用这些 props 的行为。
    1. 使用 Context,Redux 等。不要使用 Legacy 的 Context API 。
    2. 改善组件设计,避免多早的把 Render 逻辑拆分为 Component(这会导致 Drilling 程度的加重),直到需要复用,再进行拆分。
    3. 使用 Compound Component Pattern 等方式来进行组件设计,也可以避免这种情况。

    什么是 Compund Component Pattern 呢,参考下面的代码形式:

    ```jsx

    import React from "react";
    import { Counter } from "./Counter";

    function Usage() {
    const handleChangeCounter = (count) => {
    console.log("count", count);
    };

    return (
    <Counter onChange={handleChangeCounter}>
    <Counter.Decrement icon="minus" />
    <Counter.Label>Counter</Counter.Label>
    <Counter.Count max={10} />
    <Counter.Increment icon="plus" />
    </Counter>
    );
    }

    export { Usage };

    ```
    TrickWu
    TrickWu
    Jul 15, 2021
    27
    可以试试状态管理器 hox
    用 hook 很方便
    ruoxie
    ruoxie
    Jul 15, 2021
    28
    楼上 hox +1,用了一年多了,很舒适
    netwjx
    netwjx
    Jul 15, 2021
    29
    全局变量系列: redux, pub/sub, 普通模块
    上下文系列: context, npm: local thread

    排名不分先后
    Balibabo
    Balibabo
    Jul 15, 2021
    30
    之前写购物车的时候,一开始没上 redux,然后全选 商家选择 商品选择传递勾选状态变更,好家伙给我累的
    mandoon
    mandoon
    Jul 16, 2021
    31
    context 放在逻辑层,ui 组件不要被污染就行
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1690 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 80ms · UTC 05:24 · PVG 13:24 · LAX 21:24 · JFK 00:24
    ♥ Do have faith in what you're doing.