setState()
コンポーネントの状態への変更をキューに入れ、このコンポーネントとその子を更新された状態で再レンダリングする必要があることをReactに通知します。
setStateメソッドは非同期であり、実際のところ、promiseは返されません。したがって、関数を更新または呼び出したい場合は、関数を2番目の引数としてsetState関数のコールバックと呼ぶことができます。たとえば、上記のケースでは、関数をsetStateコールバックとして呼び出しています。
setState(
{ name: "Michael" },
() => console.log(this.state)
);
上記のコードはクラスコンポーネントでは正常に機能しますが、機能コンポーネントの場合、setStateメソッドを使用することはできません。これにより、useeffectフックを利用して同じ結果を得ることができます。
頭に浮かぶ明らかな方法は、ypuがuseEffectで使用できる方法は次のとおりです。
const [state, setState] = useState({ name: "Michael" })
useEffect(() => {
console.log(state)
}, [state])
ただし、これは最初のレンダリングでも発生するため、次のようにコードを変更して、最初のレンダリングイベントを確認し、状態のレンダリングを回避できます。したがって、実装は次の方法で実行できます。
ここでユーザーフックを使用して、最初のレンダリングを識別できます。
useRefフックを使用すると、関数型コンポーネントで可変変数を作成できます。これは、DOMノード/ React要素にアクセスし、再レンダリングをトリガーせずに可変変数を格納するのに役立ちます。
const [state, setState] = useState({ name: "Michael" });
const firstTimeRender = useRef(true);
useEffect(() => {
if (!firstTimeRender.current) {
console.log(state);
}
}, [state])
useEffect(() => {
firstTimeRender.current = false
}, [])