useEffect 挂钩中的回调何时触发?

迈克尔学习者

我读过,这useEffect是异步的,所以 React 首先渲染和安装页面,并且只有在 useEffect 触发回调之后,所以有时我们会看到某些组件中的值变化非常快。

但是当我尝试在 useEffect 回调中使用自己创建的“sleep-for-3-seconds”时,React 会等到 3 秒过去,然后才渲染并安装页面,所以我看到空白页 3 秒。我们还可以注意到延迟 3 秒后快速变化的值。我不明白为什么会发生,因为 useEffect 回调应该在渲染和安装页面后运行。

你能解释一下为什么会这样吗?

代码沙箱: 链接

代码:

import { useEffect, useState } from "react";
import "./styles.css";

export default function App() {
  const [state, setState] = useState(1200000000);
  useEffect(() => {
    let start = new Date().getTime();
    let end = start;
    while (end < start + 3000) {
      end = new Date().getTime();
    }
    setState(3);
  }, []);
  return (
    <div className="App">
      <h1>Hello CodeSandbox</h1>
      <h2>Start editing to see some magic happen!</h2>
      <div>Value is : {state}</div>
    </div>
  );
}
TJ克劳德

我读过,这useEffect是异步的,所以 React 首先渲染和装载页面,并且只有在useEffect触发回调之后,所以有时我们会看到某些组件中的值变化非常快。

正确的。这是记录在这里

传递给 useEffect 的函数将在渲染提交到屏幕后运行。

这里

效果时间

componentDidMountand不同componentDidUpdate,该函数在延迟事件期间在layoutpaintuseEffect之后触发。

(他们的重点)

继续你的问题:

但是当我尝试在 useEffect 回调中使用自己创建的“sleep-for-3-seconds”时,React 会等到 3 秒过去,然后才渲染并安装页面,所以我看到空白页 3 秒。

这很奇怪,我没有看到这种行为:

const { useState, useEffect} = React;

function App() {
    const [state, setState] = useState(1200000000);
    useEffect(() => {
        let start = new Date().getTime();
        let end = start;
        while (end < start + 3000) {
            end = new Date().getTime();
        }
        setState(3);
    }, []);
    return (
      <div className="App">
        <h1>Hello CodeSandbox</h1>
        <h2>Start editing to see some magic happen!</h2>
        <div>Value is : {state}</div>
      </div>
    );
}

ReactDOM.render(<App />, document.getElementById("root"));
<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.development.js"></script>

当我运行它时,我看到页面以初始状态值呈现1200000000,然后三秒后我看到它使用修改后的状态值更新。

我也看不到这个更简单的例子:

const {useEffect} = React;

const Example = () => {
    useEffect(() => {
        const stop = Date.now() + 3000;
        while (Date.now() < stop) {
            // Wait (NEVER DO THIS IN REAL CODE)
        }
        console.log("Done waiting");
    }, []);
    return <div>x</div>;
};

ReactDOM.render(<Example />, document.getElementById("root"));
<div id="root"></div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/17.0.2/umd/react.development.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/17.0.2/umd/react-dom.development.js"></script>

当我运行它时,我看到了x组件渲染,然后三秒钟后我看到console.log等待已经完成。

但是如果你没有看到你描述的内容,那只是因为浏览器在useEffect调用之前没有机会实际绘制页面,尽管 React 的代码试图确保这种情况。而且由于您的代码处于忙等待状态,因此主线程与该循环相关联,并且浏览器无法更新页面显示。

但同样,我没有看到useEffect(你会看到useLayoutEffect)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

挂钩如何知道何时触发(或不触发)useEffect主体?

如何在useEffect挂钩中设置状态?

addEventListener在useEffect挂钩中不起作用

我可以在useEffect挂钩中设置状态

无法在useEffect挂钩中设置状态

无法在useEffect挂钩中测试超时功能

如何显示useEffect挂钩中的数据?

在将useEffect挂钩与依赖项一起使用时,何时触发清除功能?

无法在useEffect挂钩中使用React表单数据

我如何在useEffect()挂钩中访问变量

React useEffect挂钩中的Fetch API没有响应

如何避免useEffect挂钩中的递归依赖项

如何在useEffect挂钩中使用Formik setFieldValue

React-访问在useEffect挂钩中结算的对象属性

在React.useEffect挂钩中未调用clearInterval

渲染之前在useEffect挂钩中获取数据-React

useEffect挂钩中的问题以在React.js中获取api

的setState回调的更换反应钩与useEffect挂钩复杂的情况下无法正常工作

ReactTransitionGroup挂钩中的回调是什么?

了解React的钩子useEffect函数。何时调用useffect中的回调函数(即取消订阅)?

何时使用useEffect?

REACT - 在 useEffect 回调中访问状态

回调不更新状态的useEffect

ReactHooks:用于调用useEffect回调函数的选项,取决于useEffect被触发的原因(在渲染或状态更新时)

反应子 useEffect 早于父 useEffect 触发

UseState不会触发useEffect

触发反应 useEffect

useEffect挂钩在状态更改后未触发

测试自定义挂钩和useEffect不触发