React Hooks は 2 回レンダリングされます 質問する

React Hooks は 2 回レンダリングされます 質問する

シーンを定義します。親のプロパティと自身の状態を使用するコンポーネントがあります。

2 つのコンポーネント DC と JOKER があり、その下の手順を実行します。

  1. DCのボタンをクリック
  2. DC セットカウント
  3. JOKERは古い状態でレンダリングされます
  4. useEffectとsetCountを実行する
  5. JOKERが再びレンダリング

ここに画像の説明を入力してください

JOKER がなぜ 2 回レンダリング (ステップ 3 と 5) し、最初のレンダリングでパフォーマンスが浪費されるのかを知りたいです。ステップ3はやりたくないクラス コンポーネントの場合は、componentShouldUpdate を使用してこれを回避できます。しかし、Hooks にも同じものがありますか?

下のコード、またはこのウェブサイトを開いてくださいhttps://jsfiddle.net/stephenkingsley/sw5qnjg7/

import React, { PureComponent, useState, useEffect, } from 'react';

function JOKER(props) {
  const [count, setCount] = useState(props.count);
  useEffect(() => {
    console.log('I am JOKER\'s useEffect--->', props.count);
    setCount(props.count);
  }, [props.count]);

  console.log('I am JOKER\'s  render-->', count);
  return (
    <div>
      <p style={{ color: 'red' }}>JOKER: You clicked {count} times</p>
    </div>
  );
}

function DC() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => {
        console.log('\n');
        setCount(count + 1);
      }}>
        Click me
      </button>
      <JOKER count={count} />
    </div>
  );
}

ReactDOM.render(<DC />, document.querySelector("#app"))

ベストアンサー1

これは StrictMode の意図的な機能です。これは開発時にのみ発生し、レンダリング フェーズに偶発的に生じた副作用を見つけるのに役立ちます。フックのあるコンポーネントに対してのみこれを行います。フックのあるコンポーネントでは、誤った場所に副作用が誤って発生する可能性が高くなるためです。--gaearon は 2019 年 3 月 9 日にコメントしました

おすすめ記事