V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
HariopaNic
V2EX  ›  问与答

react hook 的 setState 没有 callback 大家是怎么使用得心应手的哦?

  •  
  •   HariopaNic · 2021-03-05 16:45:48 +08:00 via iPhone · 1111 次点击
    这是一个创建于 1119 天前的主题,其中的信息可能已经有所发展或是发生改变。
    比如一个最基础的刷新列表功能:
    刷新调取的函数
    const onRefresh = async () => {
    setRefreshing(true);
    setPageNo(1);
    setIsListEnd(false);
    setList([]);
    initList();
    setRefreshing(false);
    }
    拿数据的函数
    const initList = async () => {
    if (isLoading || isListEnd) return;
    setIsLoading(true);
    //在此处调取 api
    let res =......;
    setList(list.concat(res));
    setPageNo(pageNo + 1);
    setIsLoading(false);
    if (res.length < pageSize) setIsListEnd(true);
    }
    在刷新函数里 set 的值在 initList 函数里使用时都不是最新的,没有 callback 使用咋那么不得劲呢,有没有大佬指点下该怎么改,谢谢了。
    15 条回复    2021-03-05 19:52:59 +08:00
    HariopaNic
        1
    HariopaNic  
    OP
       2021-03-05 16:53:17 +08:00
    up……
    HariopaNic
        2
    HariopaNic  
    OP
       2021-03-05 17:00:52 +08:00
    up
    HariopaNic
        3
    HariopaNic  
    OP
       2021-03-05 17:00:58 +08:00
    uppppp
    kyuuseiryuu
        4
    kyuuseiryuu  
       2021-03-05 17:17:51 +08:00
    有用到 state 的函数要用 useCallback

    const fn = useCallback(initList, [list, pageNo, isLoading, isListEnd]);
    newbieRenew
        5
    newbieRenew  
       2021-03-05 17:34:19 +08:00 via iPhone
    你都 async 了。await 后再 set
    PeakFish
        6
    PeakFish  
       2021-03-05 17:40:16 +08:00
    用 useEffect 监听数据改变处理啊, 你没发现 useEffect 就是 vue 里面的 watch 吗。监听变量改变然后自己操作。
    JetMac
        7
    JetMac  
       2021-03-05 17:51:29 +08:00
    HariopaNic
        8
    HariopaNic  
    OP
       2021-03-05 17:55:08 +08:00 via iPhone
    @JetMac 你这个就进入的时候调用一次啊,我的场景是 set 之后在 fetchdata 函数中拿不到最新的 state
    HariopaNic
        9
    HariopaNic  
    OP
       2021-03-05 17:55:48 +08:00 via iPhone
    @newbieRenew await setState 没用吧,我试了下没效果。
    newbieRenew
        10
    newbieRenew  
       2021-03-05 18:02:16 +08:00 via iPhone
    你是不是用到定时器了,记得清除
    Hanser002
        11
    Hanser002  
       2021-03-05 18:31:05 +08:00
    你可以把 useEffect 当成 callback 使用
    yushiro
        12
    yushiro  
       2021-03-05 19:05:08 +08:00 via iPhone
    用 useEffect,监听某个 state 的值,发生变化了,就会执行 effect
    momocraft
        13
    momocraft  
       2021-03-05 19:09:31 +08:00
    如果你非常想要 callback 应该可以用 useState+useRef+useEffect 糊一个
    imjamespond2020
        14
    imjamespond2020  
       2021-03-05 19:34:42 +08:00 via Android
    好拿最新值直接 setFoo(foo=>这是最新的 foo)。。。。
    DOLLOR
        15
    DOLLOR  
       2021-03-05 19:52:59 +08:00 via Android
    setState 可以接受一个函数,函数的参数就是最新值。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3215 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 13:08 · PVG 21:08 · LAX 06:08 · JFK 09:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.