目次を読むには、元の投稿 https://devaradise.com/react-custom-hooks-best-practices/ をチェックしてください
React 開発者であれば、コンポーネント間でロジックを共有する必要がある状況に遭遇したことがあるでしょう。この投稿では、カスタム フックとは何か、カスタム フックをいつ使用するか、カスタム フックを作成する際のベスト プラクティス、および React アプリケーションをよりクリーンで保守しやすくするための一般的な使用例について説明します。
React に関する関連投稿
カスタム フックは、React コンポーネント間で共有できるステートフル ロジックを備えた再利用可能な関数です。これらは接頭辞の use から始まり、その内部で他のフックを呼び出すことができるため、複雑な状態と効果のロジックを単純で再利用可能な関数に抽象化することができます。
React カスタム フックは、コードを複製せずにアプリケーションの異なる部分間でロジックを共有する必要がある状況に最適です。これにより、コンポーネントがよりクリーンに保たれるだけでなく、よりモジュール化されたコードベースが促進されます。
カスタムフックは、通常の JavaScript の再利用可能な関数とは異なることに注意してください。カスタム フックはステートフルです。つまり、useState フックまたはその他の組み込みフックで反応状態を使用する必要があります。
カスタム フックは、コンポーネント間でステートフル ロジックを再利用する必要がある場合、特にデータのフェッチ、フォーム処理、認証などの複雑なタスクに最適です。これらにより、コンポーネント コードが簡素化され、可読性が向上し、テストとメンテナンスが容易になります。
カスタム フックのもう 1 つの主要な使用例は、同じコードを複数の場所に記述している場合です。同じロジックをコピーして貼り付ける代わりに、それをカスタム フックに抽出し、必要なときに再利用できます。これにより、DRY (Don't Reply Yourself) 原則が促進され、コードベースがより効率的になり、エラーが発生しにくくなります。
カスタム フックを作成する場合、効果的かつ保守可能であることを保証するために留意すべきベスト プラクティスがいくつかあります。以下に重要なガイドラインをいくつか示します:
カスタムフックの名前は常に use で始まります。これは、他の React 開発者がこれらの関数をフックとして識別し、フックのルールが正しく適用されるようにするのに役立つ規則です。
フックが純粋な関数であることを確認してください。フック内で直接副作用が発生するのを避けてください。代わりに、useEffect または同様のフックを使用して管理します。
副作用とは、レンダリング後にコンポーネントで発生する操作や動作であり、現在のコンポーネントのレンダリング サイクルに直接影響を与えません。
特に高コストの計算や複雑な状態の更新を扱う場合は、useMemo や useCallback などのメモ化手法を使用して、フックによる不必要な再レンダリングの発生を防ぎます。
useState、useEffect、useReducer、useCallback などの組み込みフックを利用して、カスタム フック内の状態と副作用を管理します。
状態、関数、または公開したい値を含むフックから、一貫した値の型を持つ配列またはオブジェクトを返します。これにより、フックが提供するものとその使用方法が明確になります。
カスタムフックが十分にテストされていることを確認してください。 React Testing Library や Jest などのツールを使用して、フックの動作を検証するテストを作成します。
カスタムフックに関する明確なドキュメントを提供してください。他の人 (そしてあなた自身) が使いやすく、保守しやすいように、それらの機能、パラメーター、戻り値を説明します。
フックを複雑にしすぎないようにしてください。フックが複雑になり始めた場合は、より小さく、より焦点を絞ったフックに分割することを検討してください。
フックの責任が 1 つだけであることを確認してください。
フック内でエラーを適切に処理します。これにより、これらのフックを使用するコンポーネントは、中断することなく予期しないシナリオを処理できるようになります。
React プロジェクトで発生する可能性のあるカスタム フックの一般的な使用例をいくつか示します。
API エンドポイントからデータを取得するためのカスタム フックは、データを取得して表示する必要があるさまざまなコンポーネント間で再利用できます。
import { useState, useEffect } from 'react'; function useFetch(url) { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { async function fetchData() { try { const response = await fetch(url); if (!response.ok) { throw new Error('Network response was not ok'); } const result = await response.json(); setData(result); } catch (err) { setError(err); } finally { setLoading(false); } } fetchData(); }, [url]); return { data, loading, error }; }
const Component = () => { const { data, loading, error } = useFetch('https://example.com/api/path'); if (loading) return <div>Loading...</div>; if (error) return <div>Error: {error.message}</div>; return ( <div> <h1>Data:</h1> <pre class="brush:php;toolbar:false">{JSON.stringify(data)}
カスタム フックはフォームの状態を管理し、検証を処理し、送信ハンドラーを提供できるため、フォーム管理が簡単になります。
import { useState } from 'react'; function useForm(initialValues) { const [values, setValues] = useState(initialValues); const [errors, setErrors] = useState({}); const handleChange = (event) => { const { name, value } = event.target; setValues({ ...values, [name]: value }); }; const validate = (name, value) => { if (value.trim() === '') { setErrors((prevErrors) => ({ ...prevErrors, [name]: 'This field is required' })); } else { setErrors((prevErrors) => ({ ...prevErrors, [name]: '' })); } }; const handleSubmit = (event, callback) => { event.preventDefault(); if (Object.values(errors).every((err) => err === '')) { callback(values); } }; return { values, handleChange, handleSubmit, validate, errors }; }
const Component = () => { const { values, errors, handleChange, handleSubmit } = useForm({ username: '', password: '' }, validate); const submit = () => { alert('Form submitted successfully'); }; return ( <form onSubmit={(e) => handleSubmit(e, submit)}> <div> <label>Username</label> <input type='text' name='username' value={values.username} onChange={handleChange} /> {errors.username && <p>{errors.username}</p>} </div> <button type='submit'>Submit</button> </form> ); };
ログイン、ログアウト、ユーザーが認証されているかどうかの確認など、ユーザー認証状態の管理。
import { useState, useEffect } from 'react'; function useAuth() { const [user, setUser] = useState(null); useEffect(() => { const loggedUser = localStorage.getItem('user'); if (loggedUser) { setUser(JSON.parse(loggedUser)); } }, []); const login = (userData) => { setUser(userData); // call login api here localStorage.setItem('user', JSON.stringify(userData)); }; const logout = () => { setUser(null); localStorage.removeItem('user'); }; return { user, login, logout }; }
ウィンドウ サイズの変更を追跡するためのカスタム フック。レスポンシブ デザインに役立ちます。
import { useState, useEffect } from 'react'; function useWindowSize() { const [size, setSize] = useState({ width: window.innerWidth, height: window.innerHeight }); useEffect(() => { const handleResize = () => { setSize({ width: window.innerWidth, height: window.innerHeight }); }; window.addEventListener('resize', handleResize); return () => window.removeEventListener('resize', handleResize); }, []); return size; }
入力変更をデバウンスするためのカスタム フック。これは、検索入力や関数呼び出しを遅らせたいその他のシナリオに役立ちます。
import { useState, useEffect } from 'react'; function useDebounce(value, delay) { const [debouncedValue, setDebouncedValue] = useState(value); useEffect(() => { const handler = setTimeout(() => { setDebouncedValue(value); }, delay); return () => { clearTimeout(handler); }; }, [value, delay]); return debouncedValue; }
カスタム フックを使用すると、React コードの再利用性と保守性が向上し、コードを大幅に簡素化できます。フック内で直接副作用を回避する、配列やオブジェクトを直接変更しないなどのベスト プラクティスに従うことで、予測可能でテストが簡単なフックを作成できます。
この投稿が役立つと思われた場合は、「いいね!」を付けて共有することを検討してください。カスタムフックについて意見や提案がある場合は、お気軽にコメントに投稿してください。
ありがとう、ハッピーコーディング!
以上がReact カスタムフックのベストプラクティス: 使用例付きの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。