【问题标题】:React Hooks: is rendering always completed after setState + setTimeout?React Hooks:渲染总是在 setState + setTimeout 之后完成吗?
【发布时间】:2020-11-10 17:39:26
【问题描述】:

免责声明:我不认为以下方法是一种好的做法。可能我可能或必须使用useEffect,但我仍然想评估现有代码的正确性。

在钩子和功能组件的上下文中,以下假设是否正确?

{
    setState(newValue);
    setTimeout(() => {
       //Here code expects that re-rendering of all components affected by changing state has been completed.
    }, 0);
}

我可以确定在setTimeout 之后重新渲染已经完成还是不能保证?

  1. 这个假设对于当前的 React 版本是否正确?如果没有,是否有特定的行为破坏它?

  2. 它会受到即将到来的 React 更改的影响吗?

【问题讨论】:

    标签: reactjs react-hooks


    【解决方案1】:

    无法保证。为了保证你的状态已经改变,你需要像这样使用useEffect

    useEffect(() => {
       // do something now that state has changed
    }, [state])
    

    【讨论】:

    • 谢谢,但有没有具体的原因,或者有一个例子说明了这一点?
    • 根据React documentation“如果你熟悉React类的生命周期方法,你可以认为useEffect Hook是componentDidMount、componentDidUpdate和componentWillUnmount的组合。”所以它会在组件更新时触发,保证状态已经改变。
    • 我熟悉useEffect,这是一个很好的解决方案,但我的问题是务实的:鉴于我已经使用setTimeout 方式编写了代码,是否有任何警告或边缘情况不能以所描述的方式工作?
    • 啊,我想这里需要注意的是,如果状态变化的时间超过 0 秒。那么您在setTimeout 中的代码可能正在使用陈旧状态。所以不,你不能确定。而且您可能希望进行重构以确保安全。
    • @AlDuncanson 这不正确。 setTimeout 延迟为 0 秒并不意味着 0 秒。这意味着最少零秒,没有最长时间。这只是意味着下次完全清除堆栈时,将从队列中拉出此回调。由于在请求状态更新后回调被放入队列,如果所有状态都同步更新,setTimeout 将保证重新渲染完成。请记住,由于捕获了闭包值,因此使用任何状态值总是会过时。所以:这是一个hack,使用useEffect
    猜你喜欢
    • 2017-11-01
    • 2021-01-29
    • 2020-02-19
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多