一个困扰了我 2 天的前端问题咨询 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
rexchen94

一个困扰了我 2 天的前端问题咨询

  •  
  •   rexchen94 Jan 27, 2021 1484 views
    This topic created in 1916 days ago, the information mentioned may be changed or developed.
    语言:React

    业务场景:有一张表格,表格里一行数据代表将要发起一次请求。打个比方有 10 条数据,现在要异步同时发起这 10 个请求,每个请求完成后更新表格中对应数据的 loading 状态,success 状态和 fail 状态。

    当前的写法:
    表格数据是 data,stack[]中有 10 个请求参数,stack.map(params=>request(params) ;
    request 函数: (params) => {
    const temp = [...data];
    const index = temp.findIndex(row => row.id === params.id);
    temp.splice(index,1,{...temp[index],...{status:'loading'}});
    setData(temp);
    axios(params).then( // 利用 splice 同样将 status 改成 success 然后 setData ) }))

    问题点:表格视图上状态不能成功更新,每次状态更新都会覆盖上一次的数据,导致表格里 10 条数据执行到哪个哪个状态就是成功,会把其他数据的状态给还原成空
    10 replies    2021-01-29 09:30:29 +08:00
    GDC
        1
    GDC  
       Jan 27, 2021
    弄一个组件用来展示每行数据的状态,比如 Row
    把 10 条数据渲染为 10 个 Row,每个 Row 处理自身的 request 和更新自己的状态
    zuiluo
        2
    zuiluo  
       Jan 27, 2021
    看了半天才理解...


    request 之后请重新读取一次 current state 再进行操作更新就没问题了,而不是读前面的 state
    azcvcza
        3
    azcvcza  
       Jan 28, 2021
    既然是同时发请求,为什么不用
    ``
    Promise.all(array.map(val=>{
    return new Promise(resolve=>{
    return axios.post()
    }).then(res=>{
    resolve(res);
    })
    })).then(resAll=>{
    // dealWith allResponse
    })
    ``
    rexchen94
        4
    rexchen94  
    OP
       Jan 28, 2021
    @azcvcza 你这样不能实时更新请求状态的,要等全部请求完成了才会更新
    rexchen94
        5
    rexchen94  
    OP
       Jan 28, 2021
    @GDC 好主意,但是每个 Row 处理完还要反馈给父元素去做判断是否全部 Row 都完成了
    rexchen94
        6
    rexchen94  
    OP
       Jan 28, 2021
    @zuiluo 异步执行的,如果是同步那可以读 current state
    zuiluo
        7
    zuiluo  
       Jan 28, 2021
    @rexchen94 不管异步或不异步,发出多少请求,最终都是单线程在线性处理,每次都读取 current state,不可能出错。建议 review 一下代码是否有问题
    azcvcza
        8
    azcvcza  
       Jan 28, 2021
    那你可能需要一份独立的状态更新了,class component 一般是挂在 this.xxx 上,fc 则是用 useRef 。class component 还有 this.setState(state, callback),在 callback 里拿到最新的 state,fc 里没有,碰到这种问题,好像 dan abramov 建议是优化成用 useReducer 来更新状态,可以参考一下官网例子或者 dan 的 blog,https://overreacted.io/zh-hans/a-complete-guide-to-useeffect/ 子标题为‘解耦来自 Actions 的更新’
    GDC
        9
    GDC  
       Jan 28, 2021 via iPhone
    @rexchen94 为啥还需要反馈给父组件……
    rexchen94
        10
    rexchen94  
    OP
       Jan 29, 2021
    @GDC 因为当所有请求全部完成时需要给出提示
    About     Help     Advertise     Blog     API     FAQ     Solana     4599 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 35ms UTC 10:09 PVG 18:09 LAX 03:09 JFK 06:09
    Do have faith in what you're doing.
    ubao msn 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