Open9
React
RSC
制御、非制御
- Reactに値を管理させる(制御コンポーネント)
- DOMに値を管理させる(非制御コンポーネント)
制御
import React, { useState } from 'react';
const ControlledForm = () => {
// ReactのuseStateフックを使用してフォームの入力値を管理
const [inputValue, setInputValue] = useState('');
// 入力変化時に実行される関数
const handleChange = (event) => {
setInputValue(event.target.value); // 入力値を状態にセットする
};
// フォーム送信時に実行される関数
const handleSubmit = (event) => {
event.preventDefault(); // フォーム送信時のページリロードを防ぐ
alert(`送信された値: ${inputValue}`); // 入力値をアラート表示
};
return (
<form onSubmit={handleSubmit}>
<label>
入力:
<input
type="text" // テキスト入力フィールド
value={inputValue} // 入力値をstateにバインド
onChange={handleChange} // 入力中の変化をhandleChangeで受け止める
/>
</label>
<button type="submit">送信</button> {/* 送信ボタン */}
</form>
);
};
export default ControlledForm;
Reactっぽくて直感的に扱いやすいが、Input一文字ごとに再レンダリングが走ってしまう。バリデーションも手続き的になりがち
非制御
import React, { useRef } from 'react';
const UncontrolledForm = () => {
// useRefで参照を作成
const nameInputRef = useRef(null);
const handleSubmit = (event) => {
event.preventDefault();
// refを使って入力内容にアクセス
alert(`Entered Name: ${nameInputRef.current.value}`);
};
return (
<form onSubmit={handleSubmit}>
<div>
<label htmlFor="name">Name: </label>
<input type="text" id="name" ref={nameInputRef} />
</div>
<div>
<button type="submit">Submit</button>
</div>
</form>
);
};
export default UncontrolledForm;
非制御はパフォーマンスに優れるものの、ちょっと直感的じゃない感じ…RHFとかいれるとバリデーションも複雑なことが割と簡単にできる。
ErrorBoundary
現在、関数コンポーネントとしてエラーバウンダリを書く方法はありません。しかし、自分でエラーバウンダリクラスを書く必要はありません。例えば、代わりに react-error-boundary を使用することができます。
<Component />
と Component()
は違う
Component()
評価された時点で関数コンポーネントが呼び出される
<Component />
→ React.createElement(Component, null, null)
Component を呼び出すタイミングは React.createElement 側に委
ねられている
React のライフサイクルで管理される
hooks
- 目的
- 再利用
- 責務の分離
- テスタビリティ
自分の中のcustom hooksを作るタイミングとして「複数のComponentで共有したいような汎用的な処理」が出てきたときに src/hooks に汎用hooksとして切り出す、という形をとっていました。
ただ、このルールだと「他のComponentとかぶる処理はないけどロジックが多めなComponent」の内部ロジックがどんどん膨らんできてしまうんですよね。
大きく
- 再利用のための切り出し
- コンポ肥大化を抑えるための切り出し
に分けられる気がする。1はsrc/hooks
フォルダとかを作って管理し、2は各コンポ内にファイル作ればよさそうな気がする