V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
HariopaNic
V2EX  ›  问与答

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

  •  
  •   HariopaNic · Mar 5, 2021 via iPhone · 1566 views
    This topic created in 1878 days ago, the information mentioned may be changed or developed.
    比如一个最基础的刷新列表功能:
    刷新调取的函数
    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 replies    2021-03-05 19:52:59 +08:00
    HariopaNic
        1
    HariopaNic  
    OP
       Mar 5, 2021
    up……
    HariopaNic
        2
    HariopaNic  
    OP
       Mar 5, 2021
    up
    HariopaNic
        3
    HariopaNic  
    OP
       Mar 5, 2021
    uppppp
    Chemist
        4
    Chemist  
       Mar 5, 2021
    有用到 state 的函数要用 useCallback

    const fn = useCallback(initList, [list, pageNo, isLoading, isListEnd]);
    newbieRenew
        5
    newbieRenew  
       Mar 5, 2021 via iPhone
    你都 async 了。await 后再 set
    PeakFish
        6
    PeakFish  
       Mar 5, 2021
    用 useEffect 监听数据改变处理啊, 你没发现 useEffect 就是 vue 里面的 watch 吗。监听变量改变然后自己操作。
    HariopaNic
        8
    HariopaNic  
    OP
       Mar 5, 2021 via iPhone
    @JetMac 你这个就进入的时候调用一次啊,我的场景是 set 之后在 fetchdata 函数中拿不到最新的 state
    HariopaNic
        9
    HariopaNic  
    OP
       Mar 5, 2021 via iPhone
    @newbieRenew await setState 没用吧,我试了下没效果。
    newbieRenew
        10
    newbieRenew  
       Mar 5, 2021 via iPhone
    你是不是用到定时器了,记得清除
    Hanser002
        11
    Hanser002  
       Mar 5, 2021
    你可以把 useEffect 当成 callback 使用
    yushiro
        12
    yushiro  
       Mar 5, 2021 via iPhone
    用 useEffect,监听某个 state 的值,发生变化了,就会执行 effect
    momocraft
        13
    momocraft  
       Mar 5, 2021
    如果你非常想要 callback 应该可以用 useState+useRef+useEffect 糊一个
    imjamespond2020
        14
    imjamespond2020  
       Mar 5, 2021 via Android
    好拿最新值直接 setFoo(foo=>这是最新的 foo)。。。。
    AV1
        15
    AV1  
       Mar 5, 2021 via Android
    setState 可以接受一个函数,函数的参数就是最新值。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   844 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 56ms · UTC 21:22 · PVG 05:22 · LAX 14:22 · JFK 17:22
    ♥ Do have faith in what you're doing.