React: 使用 useState 调用意外的函数组件

创建于 2019-12-20  ·  3评论  ·  资料来源: facebook/react

您要请求功能还是报告错误

目前的行为是什么?

import React, { useState, useEffect } from "react";
import ReactDOM from "react-dom";

import "./styles.css";

function Child() {
  console.log("Child render");
  return null;
}

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

  console.log("Render");

  useEffect(() => {
    console.log("count changed", count);
  }, [count]);

  return (
    <div>
      <h2>UseState</h2>
      <p>clicked: {count}</p>
      <button
        onClick={() => {
          setCount(count + 1);
        }}
      >
        +1
      </button>
      <button
        onClick={() => {
          setCount(count);
        }}
      >
        +0
      </button>
      <Child />
    </div>
  );
}

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

此计数示例中有两个按钮。 单击一个使计数+1,另一个使计数不变。 如果先单击无更改按钮,则不会记录“渲染”。 但是如果先点击+1按钮再点击anthor,“渲染”会显示两次,而“子渲染”只会显示一次。

我在文档中找到了解释。

如果您将 State Hook 更新为与当前状态相同的值,React 将退出而不渲染子项或触发效果。 (React 使用 Object.is 比较算法。)

React 是否只承诺在这种情况下不会渲染 Children 组件? 当前组件可能仍会被渲染?

这是沙箱中的一个例子。

https://codesandbox.io/s/long-firefly-nz5px?fontsize=14&hidenavigation=1&theme=dark

哪些版本的 React 以及哪些浏览器/操作系统受此问题影响?

“反应”:“^ 16.12.0”,
"react-dom": "^16.12.0",

Question

最有用的评论

这个问题看起来不像是一个“错误”,而是一个需要澄清的问题? :微笑:

您引用的文档部分下方的下一段说明了这一点:

请注意,在退出之前,React 可能仍需要再次渲染该特定组件。 这不应该是一个问题,因为 React 不会不必要地“深入”到树中。

当 React 知道它是安全的时,它会尽早退出。 在某些情况下,它需要做更多的工作以确保可以安全地退出。

如果不深入了解当前的实现细节,就无法解释为什么会出现这种情况的原因——这可能没有那么有用而且随着我们继续研究并发模式等新 API

好消息是,正如文档所提到的,React 在这两种情况下所做的额外工作量应该很小!

所有3条评论

这个问题看起来不像是一个“错误”,而是一个需要澄清的问题? :微笑:

您引用的文档部分下方的下一段说明了这一点:

请注意,在退出之前,React 可能仍需要再次渲染该特定组件。 这不应该是一个问题,因为 React 不会不必要地“深入”到树中。

当 React 知道它是安全的时,它会尽早退出。 在某些情况下,它需要做更多的工作以确保可以安全地退出。

如果不深入了解当前的实现细节,就无法解释为什么会出现这种情况的原因——这可能没有那么有用而且随着我们继续研究并发模式等新 API

好消息是,正如文档所提到的,React 在这两种情况下所做的额外工作量应该很小!

这个问题看起来不像是一个“错误”,而是一个需要澄清的问题? 😄

您引用的文档部分下方的下一段说明了这一点:

请注意,在退出之前,React 可能仍需要再次渲染该特定组件。 这不应该是一个问题,因为 React 不会不必要地“深入”到树中。

当 React 知道它是安全的时,它会尽早退出。 在某些情况下,它需要做更多的工作以确保可以安全地退出。

如果不深入了解当前的实现细节,就无法解释为什么会出现这种情况的原因——这可能不会那么有用_而且_随着我们继续开发新的 API,如并发模式,它们可能会在即将发布的版本中改变和悬念。

好消息是,正如文档所提到的,React 在这两种情况下所做的额外工作量应该很小!

Thx,真是个粗心大意的人! 😁

不用担心! 😄

此页面是否有帮助?
0 / 5 - 0 等级