基本反应问题。为啥在 React 文档的这个例子中需要 useEffect ?

Posted

技术标签:

【中文标题】基本反应问题。为啥在 React 文档的这个例子中需要 useEffect ?【英文标题】:Basic React question. why is useEffect needed in this example from the React documentation?基本反应问题。为什么在 React 文档的这个例子中需要 useEffect ? 【发布时间】:2022-01-10 19:20:21 【问题描述】:

react文档中给出了这个例子来描述useEffect的使用。

import React,  useState, useEffect  from 'react';

function Example() 
  const [count, setCount] = useState(0);

  // Similar to componentDidMount and componentDidUpdate:
  useEffect(() => 
    // Update the document title using the browser API
    document.title = `You clicked $count times`;
  );

  return (
    <div>
      <p>You clicked count times</p>
      <button onClick=() => setCount(count + 1)>
        Click me
      </button>
    </div>
  );

如果不使用下面的 useEffect 就不能重写吗? 为什么首选useEffect?

import React,  useState, useEffect  from 'react';

function Example() 
  const [count, setCount] = useState(0);

  const handleChange = () => 
      setCount(count + 1);
      document.title = `You clicked $count times`;
  

  return (
    <div>
      <p>You clicked count times</p>
      <button onClick=handleChange>
        Click me
      </button>
    </div>
  );

【问题讨论】:

【参考方案1】:

这里有两个问题:

在当前渲染中调用状态设置器 won't reassign the stateful const 变量 - 您需要等到 next 渲染才能更新 count,所以

const handleChange = () => 
    setCount(count + 1);
    document.title = `You clicked $count times`;

行不通。单击后,您的第二个 sn-p 将生成 You clicked 0 times

即使有可能,当有多个地方可以调用状态设置器时,在每个地方之后放置应该发生的事情并不是很容易维护 - 最好能够放置该代码之后只在一个地方运行。

【讨论】:

很好的答案,谢谢。我完全理解你的第二个要点。对于第一个,“

You clicked count times

”为什么会正确更新?
@SamArcher 你可以想到setState 函数as being async。如果count 在设置文档标题之前发生了更新,那是偶然的(不能保证)。如果您需要在与setState 调用相同的范围内使用更新后的值,则应使用与state 值不同的变量。

以上是关于基本反应问题。为啥在 React 文档的这个例子中需要 useEffect ?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能将此信息从一个反应组件推送到另一个?

为啥react-router中的link用不了

即使道具没有改变,为啥还要对重新渲染组件做出反应?

在定义自定义选项组件时,如何为react-select应用默认样式?

为啥 Map 在这个例子中有一个 return 语句? [复制]

为啥反应路由器不工作。当我改变路径?