シーンを定義します。親のプロパティと自身の状態を使用するコンポーネントがあります。
2 つのコンポーネント DC と JOKER があり、その下の手順を実行します。
- DCのボタンをクリック
- DC セットカウント
- JOKERは古い状態でレンダリングされます
- useEffectとsetCountを実行する
- 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 日にコメントしました