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 ステートメントの使用
Docker は、アプリケーションをより速く配信するのに役立つオープンソースのコンテナ エンジンです...
背景 - オンラインアラートオンライン サーバーがアラームを発し、ディスク使用率 disk.util...
Jsで作ったスライドボタンの具体的なコードは参考までに。具体的な内容は以下のとおりですまずエフェク...
rpmインストールパッケージをダウンロードするMySQL公式サイト: https://dev.mys...
目次1. 変数の概要1.1 変数のメモリへの保存1.2 変数の使用1. 変数を宣言する2. 譲渡3....
以下にリストされているすべてのブログはオリジナルであり、独自にデザインされています。これらは、他者が...
バックエンド プログラマーは、さまざまな場所で Linux を扱います。Linux ログの読み方がわ...
実装要件ElementUI を模倣したフォームは、インデックス コンポーネント、Form フォーム ...
コンテンツを携帯電話、タブレット、支援技術のユーザーから非表示にし、キーボードのユーザーにのみ表示す...
目次Dockerコンテナのソースコードを使用してhttpdをデプロイし、ストレージボリュームを使用し...
OS X 環境で MySQL を起動すると、エラー メッセージが表示されます。 016-03-03T...
JavaScript厳密モードが 8 進数をサポートしていないという問題に関して、まず、 Java...
例: nginx ログには、アクセス ログとエラー ログの 2 つの主な種類があります。アクセス ロ...
...こんな感じで、今日はポップアップウィンドウを作ろうと思ったのですが、バックエンド PHP によ...
ステップ1: Ubuntuソースを追加するルートに切り替える suルートソフトウェアソースファイルの...