9102 了, React 更新 state 数组的最优解是什么? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dobelee
V2EX    React

9102 了, React 更新 state 数组的最优解是什么?

  •  
  •   dobelee 2019-12-25 15:37:52 +08:00 4422 次点击
    这是一个创建于 2120 天前的主题,其中的信息可能已经有所发展或是发生改变。

    state.array 是个庞大的数组。需要更新某个索引的内容。 首先

    state.array[999]['field'] = true; 

    有 react/no-direct-mutation-state 警告,但实际是可行的。

    google 众说纷纭,不引入其他库时,被推荐最多的是类似如下模式:

    let array = state.array; array[999]['field'] = true; this.setState({ array }) 

    这种很显然有性能问题,数据太多卡如。

    13 条回复    2020-02-24 16:30:05 +08:00
    s609926202
        1
    s609926202  
       2019-12-25 15:51:36 +08:00
    同,想知道正确的操作。
    hua123s
        2
    hua123s  
       2019-12-25 15:53:44 +08:00 via iPhone
    同,想知道怎么操作
    lijsh
        3
    lijsh  
       2019-12-25 16:02:34 +08:00
    你这嵌套过多了,先将数据 normalize 再放进 state
    seki
        4
    seki  
       2019-12-25 16:03:56 +08:00
    ???
    这当然是不可行的

    state.array 是一个引用,你修改 array 变量和直接修改 state.array 没有任何区别,甚至 array[999] 也不会因为你 setState 而更新

    数据太多卡住了应该先去去分析瓶颈,而不是用反模式的代码来引入潜在的 bug
    fuermosi777
        5
    fuermosi777  
       2019-12-25 16:10:13 +08:00
    immutable library?
    Mikewu
        6
    Mikewu  
       2019-12-25 16:11:28 +08:00
    https://immerjs.github.io/immer/docs/introduction
    可以考虑一下 immer.js ,我认为是接入成本最小的 immutable data 方案了
    wangxiaoaer
        7
    wangxiaoaer  
       2019-12-25 16:12:03 +08:00
    @lijsh #3

    ```
    state:{
    array:[
    {field:true},
    ....
    ]
    }
    ```

    这个结构不算嵌套很多吧。
    lijsh
        8
    lijsh  
       2019-12-25 16:17:12 +08:00
    @wangxiaoaer #7 那直接整个 array 覆盖感觉也行啊,只要绑定好 key,只有修改的 item 才会重新 render
    wangxiaoaer
        9
    wangxiaoaer  
       2019-12-25 16:19:49 +08:00
    @lijsh #8 reactjs 不太熟悉,我只是直觉认为他这个结构还是比较常用的,不算嵌套太多。
    muzuiget
        10
    muzuiget  
       2019-12-25 17:13:01 +08:00
    那个警告是对的,你搜到那个代码是错的,之所以有效是因为每次调用 this.setState() 都会强制重 render 了。

    不见得卡使用个更新数据姿势问题,你应该优化 render 里的数据量,比如延迟加载,先跳过看不见的条目。
    newbieRenew
        11
    newbieRenew  
       2019-12-25 17:25:30 +08:00 via iPhone
    immerjs 来处理吧,我目前用的是 immutable-helper,数据量小,没遇到瓶颈问题。下个项目试试 immer
    maomaomao001
        12
    maomaomao001  
       2019-12-25 17:28:04 +08:00
    mobx
    Hanggi
        13
    Hanggi  
       2020-02-24 16:30:05 +08:00
    原来 React 整天在研究这种问题。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1071 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 22ms UTC 23:06 PVG 07:06 LAX 16:06 JFK 19:06
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86