所属している「もりけん塾」でReact課題に取り組んでいます.
問題文やレビュー内容は非公開なので、課題で調べたことをまとめることにしました.
初心者の学習ノートなので、認識の間違えている点がありましたらお問い合わせからご指摘いただけるとうれしいです.
Stateの追加知識
前回に続いてStateについて調べ、実践した✏️
1つのコンポーネントで管理するStateが複数ある場合は、それぞれ独立してStateを宣言できる.
宣言する際はReactのuseState
フックを使用する.(この辺りは復習)
//例えば
const [count, setCount] = useState(0);
const [message, setMessage] = useState('');
ただ、Stateを複数にして管理すると複雑になってしまった.なるべくStateの数を減らして管理した方がコードが理解しやすく、保守しやすい状態を保てるので好ましいということを知った.
Doc「エフェクトは必要ないかもしれません」を読むと、
既存の props または state から何かを計算できる場合は、それを state に入れないでください。代わりに、レンダリング中に計算します。これにより、コードが高速になり (余分な「カスケード」更新が回避されます)、シンプルになり (一部のコードが削除されます)、エラーが発生しにくくなります (異なる状態変数が互いに同期していないことによって発生するバグが回避されます)。
状態は、アプリが記憶する必要がある最小限の変化するデータのセットであると考えてください。
アプリケーションが必要とする状態の絶対最小表現を見つけ出し、その他すべてをオンデマンドで計算します。たとえば、買い物リストを作成している場合、項目を状態の配列として保存できます。リスト内の項目数も表示したい場合は、項目数を別の状態値として保存せず、代わりに配列の長さを読み取ります。
今後もできるだけ少ないState(最小表現を見つける..!)でシンプルに管理できないか考えていこう..
Stateの更新と非同期性
例えば, ボタンをクリックした時のイベントハンドラーを考える.(これはStateが2つで構成されていて、1つでできると思ったので良くない例になるけど…)
const handleButtonClick = () => {
setCount(count + 1);
// 非同期のため、この時点では`count`はまだ更新されていません
console.log(count); // ここでは古い値が出力される
if ((count + 1) % 10 === 0) {
setMessage("10の倍数に到達しました!");
} else {
setMessage("");
}
};
上記の例だと、ボタンを押した時にsetCount( count + 1 ) が実行されることで、State変数としてcount + 1した値に変更される.
しかし、setCountした段階ではState変数 ‘count’は更新されない. よって、console.log(count)してもcount + 1 の値はまだ取得できない.
– > その後に続いているif文で’count’を使用しているけど、ここではまだ更新されていない ‘count’ が使用されている.
そのため、if文の中でも( count + 1 )として使用する必要がある.
handleButtonClick()
が実行されたとき、最後にまとめてStateが更新される.
useEffect
非同期の挙動でハマった時にuseEffectの存在を知った.
今回のような関数を更新するような場合は不適格ではあったけど、どう適していないのかを色々調べたので学習ノート書いておく. まだ理解はかなりふわっと..
使うべきところが来たら深く掘っていきたい.
useEffectとは?
公式のDocでは「コンポーネントを外部システムと同期させるための React フック」と解説されている.
PropsやStateが変化したタイミングで実行する処理を設定できる.
使い方
useEffect(() => {
// PropsやStateが変化したタイミングで実行する処理
return () => {
// 主にコンポーネントがアンマウントされる時に実行されるクリーンアップ関数
};
}, [依存配列]);
使いどころ
useEffectの使い所
- イベントハンドラを登録する
∟Reactのデフォルトの機能では実現できない場合 - 高頻度で発生するイベントを処理する場合
∟Reactの仕組みで再レンダリングを行うとパフォーマンス上の問題がある場合 - データを取得するとき(許容できるケースの場合がある)
適していないケース
- 私が行ったようなuseEffectから更新系の処理をすることはすべきではない。
- クリーンアップ関数の無い時点でユースケースとして的確でない。
∟コンポーネントがアンマウントされた時に、コンポーネントへの影響がリセットされないため
参考にした記事は以下です.
まとめ
前回初めて学んだStateについて、少し踏み込んで知ることができました.
Stateは’アプリケーションが必要とする状態の絶対最小表現’ のみ宣言するべきであると知り、今後Stateを何でもかんでも宣言せずに見極めていかないとです. (次の課題からも、そういった練習になっていくのかな👀)
引き続きReactの基礎を学んでいきます !
💡もりけん塾で勉強しています .. JavaScriptを一緒に勉強する塾生さん募集中です💡
もりけんさん(@terrace_tec)のHPはこちら