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 ステートメントの使用
Linux オペレーティング システムは過去 20 年間にわたってデータ センターに革命をもたらし...
1. コマンドの紹介passwd コマンドは、ユーザー パスワード、アカウント ロック、パスワードの...
背景ブロックチェーン ログ モジュールで作業しているときに、コンテナーが実行されている場合は、ログ ...
データベースを作成する右クリック - 新しいデータベースを作成ライブラリ名を入力し、文字セットと並べ...
テーブルに table-layer:fixed スタイルを設定し、テーブル内の行が結合されていること...
この記事では、例を使用して、MySQL データベースの列を追加、削除、および変更する方法について説明...
目次1. ブラウザのローカルストレージ技術1.1、セッションストレージ1.2、ローカルストレージ2....
序文:さまざまな技術職の面接では、MySQL 関連の質問がよくされるようです。開発職の面接でも運用職...
目次方法1: 水平スクロールバーを設定する最も簡単な方法方法2(新規):ドラッグバーを追加して外側の...
コードをコピーコードは次のとおりです。 <html> <本文> <?p...
次のような製品部品表があります。一部 部品ID 部品タイプ 製品ID ---------------...
Fuser コマンドとは何ですか? fuser コマンドは、特定のファイル、ディレクトリ、またはソケ...
React の経験がある人なら、コンポーネントインスタンスオブジェクトや DOM オブジェクトを取得...
(1)HTTPリクエストを減らす。 (リソース ファイルをマージし、イメージ スプライトを使用します...
1. 新機能MySQL 5.7 はエキサイティングなマイルストーンです。デフォルトの InnoDB ...