フックを使用すると、関数コンポーネントで状態およびその他の React 機能を使用できます。フックが導入される前は、クラスベースのコンポーネントのみが状態を持ち、ライフサイクル メソッドなどの他の React 機能を使用できました。フックを使用すると、状態やその他の React 機能を関数コンポーネントに追加して、より用途が広く再利用できるようにすることができます。
フックを使用すると、コードがより簡潔で読みやすくなります。クラスベースのコンポーネントは、特に多くの状態またはライフサイクル メソッドを管理する必要がある場合に、長く複雑になる可能性があります。フックを使用すると、シンプルで焦点を絞った関数を使用して個々の状態とロジックを処理できるため、コードが読みやすく理解しやすくなります。
フックを使用すると、ステートフル ロジックを再利用できます:フックを使用すると、コンポーネントからステートフル ロジックを抽出し、それを複数のコンポーネント間で共有できるため、コードをより再利用可能で保守しやすくなります。これは、多くのステートフル ロジックを含む複雑なコンポーネントがあり、そのロジックの一部を再利用可能な関数に抽出したい場合に特に便利です。
import React, { useState } from 'react'; const myComponent = () => { // Declare a new state variable, which we'll call "count" // The initial value of count is 0 const [count, setCount] = useState(0); return ( <div> <p>You clicked {count} times.</p> <button onClick={() => setCount(count + 1)}> Click me </button> </div> ); }
使用方法の例を次に示します。
import React, { useEffect } from 'react'; const MyComponent = () => { useEffect(() => { // Perform some side effect, like subscribing to a data source const subscription = someDataSource.subscribe(data => { // Update state with the data from the subscription setState({ data }); }); // Clean up the subscription when the component unmounts return () => subscription.unsubscribe(); }); // Render the component return ( <div> {/* Use the data from the state in the render method */} Data: {state.data} </div> ); }
この例では、useEffect フックを使用して、データ ソースへのサブスクリプションを設定し、サブスクリプションからのデータでコンポーネントの状態を更新します。また、コンポーネントのアンマウント時に呼び出されるクリーンアップ関数も含まれており、サブスクリプションが適切にクリーンアップされ、メモリ リークが発生しないようにします。
useContext の使用例を次に示します。
import React, { useContext } from 'react'; // Create a context with a default value const MyContext = React.createContext('defaultValue'); function MyComponent() { // Use the useContext hook to access the value of the context const value = useContext(MyContext); return ( <div> {/* Use the value from the context in the render method */} Value from context: {value} </div> ); }
React コンポーネントで useReducer を使用する方法の例を次に示します。
import React, { useReducer } from 'react'; const initialState = { count: 0 }; function reducer(state, action) { switch (action.type) { case 'increment': return { count: state.count + 1 }; case 'decrement': return { count: state.count - 1 }; default: throw new Error(); } } function Counter() { const [state, dispatch] = useReducer(reducer, initialState); return ( <> Count: {state.count} <button onClick={() => dispatch({ type: 'decrement' })}>-</button> <button onClick={() => dispatch({ type: 'increment' })}>+</button> </> ); }
この例では、useReducer フックを使用して単純なカウンター コンポーネントの状態を管理します。フックはレデューサー関数と初期状態で呼び出され、現在の状態と、アクションをレデューサーにディスパッチするために使用できるディスパッチ関数を返します。この場合、コンポーネントには「インクリメント」アクションと「デクリメント」アクションをレデューサーにディスパッチする 2 つのボタンがあり、それに応じて状態のカウントを更新します。
メモ化は、アプリケーションの车速と効率を往右させるために应用される最適化艺术手法です。これは、計算結果を导出し、同じ入力が再び発生したときにキャッシュされた結果を返すことによって行われます。
import { useRef } from 'react'; function MyInput() { const inputRef = useRef(null); function handleClick() { // Use the `current` property of the ref to access the DOM element inputRef.current.focus(); } return ( <div> <input type="text" ref={inputRef} /> <button onClick={handleClick}>Focus the input</button> </div> ); }
この例では、useRef を呼び出し、ref の初期値として null を渡すことによって、inputRef 変数が作成されます。次に、ref 属性を inputRef に設定することによって、この ref を入力要素に関連付けます。