Reactフック序文これまでの 3 年間、私はクラスを使用してフロントエンドの機能ページを書いてきました。実際、フックについてはしばらく前から触れてきました。私が初めてこれに出会ったのは、electron+react プロジェクトに関するコースを視聴していたときでした。当時はelectronを主に見ていたため、hooksについては特に注目していませんでした。また、私が長年クラスに慣れ親しんできたせいもあるかもしれませんが、当時はフックの関数型の記述スタイルに多少抵抗がありました。しかし、業界でフックが好意的に評価されていたため、フックを使用してプロジェクトを開始したいと思ったこともありました。しかし、当時のプロジェクト サイクルと既存のテクノロジー スタックのせいで、それを実践する機会がありませんでした。 最近、新しいプロジェクトに react hooks+ts を使用しているためです。したがって、フックの使用を開始する必要があります。実際、機能開発に関する限り、他のものをコピーするだけでは何も問題はありません。しかし、フックについて体系的かつ深く理解されていないため、多くの場合、なぜこのようにフックを使用するのかが明確ではありません。そこで最近、「React Hooks Core Principles and Practice」を見つけて勉強しました。 フックの使用と、使用法と理由のレベルでフックを使用する理由を再検討します。機能的なライティングの利点についてさらに検討します。実のところ、ある程度、私は表面をなぞっただけです。ここでは、この期間に私が学んだことを記録しているだけです。 なぜフックなのか?Hooks の大きな特徴は、ビジネス ロジックを再利用できることです。これはフックにおいて特に顕著です。例えば、通常のクラスでウィンドウサイズの変化を監視したい場合、実装後にコンポーネント内に監視イベントを追加する必要があります。しかし、このウィンドウサイズ監視機能が別の場所でも必要になった場合、このロジックコードは再利用できず、そのコンポーネント内でしか書き換えることができません。ただし、フックでは、監視ロジック コードのこの部分をフック モードでカプセル化し、論理的な再利用を完全に実現できます。 クラス用
機能についてReact の中核の 1 つは、State データから View レベルへのバインディングを実現することです。関数を使用するのは、実際には、状態からビューへのマッピングの問題を解決するより良い方法です。ただし、React のキャリアとして関数を使用すると、関数内の状態の保存とライフサイクル メソッドという 2 つの問題が発生します。
図: 関数コンポーネント自体などの実行プロセス (実行) は、従来の状態、URL、またはウィンドウのサイズにバインド (フック) できます。このように、状態、URL、またはウィンドウ サイズが変更されると、関数が再実行され、更新された結果が生成されます。 クラスとフック
//クラス内の高レベルコンポーネントは resize メソッドの再利用を実装します //1. 高レベルコンポーネントの宣言 const withWindowSize = Component => { // ウィンドウサイズを監視するロジックのみを含む高レベルコンポーネント WrappedComponent を生成します。class WrappedComponent extends React.PureComponent { コンストラクタ(props) { スーパー(小道具); この状態 = { サイズ: this.getSize() }; } コンポーネントマウント() { window.addEventListener("サイズ変更", this.handleResize); } コンポーネントのマウントを解除します(){ window.removeEventListener("サイズ変更", this.handleResize); } 取得サイズ() { window.innerWidth > 1000 ? "large" : "small" を返します。 } ハンドルサイズ変更 = () => { 現在のサイズを取得します。 this.setState({ サイズ: this.getSize() }); } 与える() { // ウィンドウ サイズを実際のビジネス ロジック コンポーネントに渡します。 return <Component size={this.state.size} />; } } WrappedComponent を返します。 }; //2. コンポーネント MyComponent は高階コンポーネントの resize 関数を使用します。クラス MyComponent は React.Component を拡張します{ 与える() { const { size } = this.props; if (size === "small") return <SmallComponent />; それ以外の場合は <LargeComponent /> を返します。 } } // withWindowSize を使用して高次コンポーネントを生成し、サイズ属性を生成して実際のビジネス コンポーネントに渡します。export default withWindowSize(MyComponent);
//Hooksはhooksメソッドを使用してサイズ変更ロジックを再利用します //useWindowSizeフックを定義します 定数getSize = () => { window.innerWidth > 1000 ? "large" : "small" を返します。 } 定数useWindowSize = () => { const [size, setSize] = useState(getSize()); 使用効果(() => { 定数ハンドラ = () => { サイズを設定する(サイズを取得する()) }; window.addEventListener('resize', ハンドラ); 戻り値 () => { window.removeEventListener('resize', ハンドラー); }; }, []); サイズを返します。 }; //関数コンポーネントでこのフックを使用する constデモ = () => { 定数サイズ = useWindowSize(); if (size === "small") return <SmallComponent />; それ以外の場合は <LargeComponent /> を返します。 };
フックは、同じビジネス ロジックのコードを可能な限り集約できます。クラス コンポーネントでは、同じビジネス ロジック コードをクラス コンポーネントの異なるライフ サイクル メソッドに分散させる必要があります。 図: 左側はクラス コンポーネント、右側はフックと組み合わせた関数コンポーネントです。青と黄色は異なるビジネス機能を表す フックはコンポーネントの状態を保存し、ライフサイクルをどのように使用しますか? React は、 1. useState: 関数が状態を維持できるようにする私たちが従うべき原則の 1 つは、次のような計算可能な値を状態に保存してはならないということです。
2. useEffect: 副作用を実行する副作用とは、現在の実行の結果に影響を与えないコードの一部です。たとえば、関数の外部で変数を変更する場合は、リクエストを開始する必要があります。形式: useEffect を使用する際の注意点: 依存関係がない場合、各レンダリング後に再実行されます。 使用効果(()=>{ console.log('re-render') //レンダリングが完了するたびに実行})
使用効果(()=>{ console.log('did mount') //componentDidMount と同等 },[])
const [size,setResize] = useState({}) 使用効果(()=>{ 定数ハンドラ = () => { サイズを設定する() } window.addEventListener('resize',ハンドラ) 戻り値 () =>{ window.removeEventListener('resize',ハンドラ) } },[]) 要約する
この記事はこれで終わりです。皆さんのお役に立てれば幸いです。また、123WORDPRESS.COM のその他のコンテンツにも注目していただければ幸いです。 以下もご興味があるかもしれません:
|
>>: MySQL データ操作 - DML ステートメントの使用
MySQL で、id、a、b の 3 つのフィールドを持つ新しいテーブルを作成します。次のように、同...
Windows 10 プラットフォームでの MySQL のインストール、構成、起動、ログイン、環境...
目次1. 計算されたプロパティ1.1 基本的な例1.2 計算プロパティキャッシュとメソッド1.3 計...
MySQL データベース管理ソフトウェアには、エンタープライズ エディションとコミュニティ エディシ...
vue2 プロジェクト開発の経験があれば、$refs に精通しているでしょう。 vue3 の急激なア...
1. 解決策1.1 インターフェースコンテキストパスの説明2 つのバックエンド インターフェイス サ...
目次インストールパッケージのダウンロードインストール環境変数の設定インストールが成功したか確認する記...
この記事では、MySQLのインストールと設定のリモートログインチュートリアルを参考までに紹介します。...
Web 上でフォントを使用することは、基本的なスキルであると同時に芸術でもあります。英語のフォントに...
サブスクリプションメッセージテンプレートを選択または作成するWeChat アプレットにログインし、「...
目次概要1. コンポジションAPI 1. ref と reactive の違いは何ですか? 2. 周...
jsonデータはhtml形式で返される必要がありますつまり、 response.setContent...
原因最近、プロジェクトのリファクタリングを始めたのですが、マスタースレーブと読み取り書き込み分離を使...
目次1. copy_{to,from}_user() とは何か1. copy_{to,from}_u...
序文ブラウザをどのようにズームしても、ボックス コンテナーの高さを常に 100% に保つ必要がある場...