LoginSignup
0
0

【雑メモ】Reactの公式ドキュメントを読んでみて

Posted at

はじめに

自身の忘備録として投稿しています。
Reactの公式ドキュメントを読んで、覚えておいた方がいいなって感じた点の雑なメモ集です。

メモ集

コンポーネントは純関数に保つ
純関数とは、同じ入力には毎回同じ出力をして、レンダー前に存在するオブジェクトや変数を変更しないもの

・レンダーは厨房での料理みたいなもの
 表示はDOMへのコミットで、料理を提供するようなこと

propsに関数を渡す際、関数が実行されてしまう状態で渡したらいけない
 だから引数が必要なときは、無名関数で包んで関数を渡している

・イベントは伝播されるから、それを停止するやつもある

・イベントハンドラは純関数である必要がなく、副作用を持っても良い

State周り

コンポーネントは初回と、stateの変更時にレンダーされる

ローカル変数の変更はレンダーをトリガーしない、レンダー間で値を保持しない

stateのセットは、現在のstateを変更するのではなく、レンダーをトリガーするだけ
stateはその値自体を変えてる訳ではなく、再レンダー中に置き換えられている

イベントハンドラ内の全てのコードが実行されるまで、再レンダーは待機される
 →バッチ処理

・更新用関数
 n => n + 1

stateは読み取り専用で利用する

オブジェクトや配列は値を直接変えることもできるけど、それはせず置き換えるべき
値が直接変えられても、stateセット関数が使われてないから再レンダーされないため、動作が不確かになる

・popやpushなどのミュータブルなメソッドは使うべきじゃない、スプレッド構文とかfilterをつかう

スプレッド構文は深さが1しかない、ネストされてる場合はそれごとに書く必要がある

不要なstateの見分け方
 stateで矛盾が生じないか 
 他のstateから得られる値ではないか
 他のstateの逆の値ではないか

・同時に更新する2つのstateはまとめてしまう、座標のx.yとか

・重複を持つstateは避ける

コンポーネントがUIツリーのなかで同じ位置にレンダーされてる間はstateを保持する

・コンポーネントは常にトップレベルで定義

keyによって、位置が同じであっても異なったコンポーネントだと認識させれる

・stateの穴掘り作業(深いstateの受け渡し)の対策として、コンテクストが使える 

Ref周り

コンポーネントに値を持たせたいけど、レンダーをトリガーしたくない場合はRefが使える
stateはレンダーをトリガーしてしまう

・ノードにフォーカスしたり、スクロールさせたり、サイズや位置の測定にDOMを直接操作する必要がある
Refの出番

・情報がイベントハンドラ内のみ必要で、再レンダー不要の時はRefが有効

・以下のようにすると、myRef.currentに対応するDOM(この場合はdiv)を入れることができる

<div ref={myRef}>

・基本的にRefは独自コンポーネントには割り当てない

Effect周り

何かを変える時は基本イベントハンドラを使う、useEffectは最終手段

・useEffectは外部システムとreactを同期させるのに使われることがある
エフェクトはブラウザ API、サードパーティのウィジェット、ネットワークなど外部システムとの同期に使われる

エフェクトはコミットの最後、画面の更新後に実行される

アンマウント関数の不足を認識しやすいように、開発環境ではuseEffectがマウント時に2回実行される

・イベントのリッスンや、何らかへの接続をuseEffect内で行い、クリーンアップ関数がなければそれが積み重なってしまう

・アプリケーションの初期化はコンポーネントの外に置く、これでブラウザがページを読み込んだ時に一度だけ実行される、使いすぎは注意

stateやpropsの変更を監視するためにuesEffectを使う必要はない
→非効率だし、stateが変更された時にレンダーがトリガされるからuseEffectがなくても更新される

・処理が重くて、特定のstateの変更のみにその処理を行いたい場合はuseMemoを使う

おわりに

気になった点があれば、まだ書き足していくと思います。

知ったつもりでいても、実際読んでみると理解が深まって楽しいですね。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0