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);

このカウントの例には2つのボタンがあります。 1つをクリックするとカウントが+1になり、もう1つをクリックしてもカウントは変更されません。 最初に[変更なし]ボタンをクリックすると、「レンダリング」はログに記録されません。 ただし、最初に+1ボタンをクリックしてからanthorをクリックすると、「レンダリング」は2回表示されますが、「子レンダリング」は1回しか表示されません。

私はドキュメントで説明を見つけました。

状態フックを現在の状態と同じ値に更新すると、Reactは子をレンダリングしたり、エフェクトを起動したりせずにベイルアウトします。 (ReactはObject.is比較アルゴリズムを使用します。)

Reactは、Childrenコンポーネントがこの状況でレンダリングされないことを約束するだけですか? 現在のコンポーネントはまだレンダリングされている可能性がありますか?

これはサンドボックスの例です。

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

Reactのどのバージョン、およびどのブラウザ/ OSがこの問題の影響を受けますか?

"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 評価