useReducer
、functionalコンポーネントの状態を処理する代替方法を提供するReact 16.8で導入されたReactフックです。レデューサー関数を使用して状態を更新することにより、より複雑な状態ロジックを管理するのに特に役立ちます。還元剤関数は、現在の状態とアクションを引数として取り、アクションタイプに基づいて新しい状態を返します。このアプローチは、人気のある国家管理ライブラリであるReduxに触発されており、州の最新情報を整理して予測可能に保つのに役立ちます。
useReducer
の構文は次のとおりです。
<code class="javascript">const [state, dispatch] = useReducer(reducer, initialArg, init);</code>
init
を渡して、初期状態を怠lazilyに作成することもできます。initialArg
で1回呼び出されます。 useReducer
を使用すると、複雑な状態を管理する際には、 useState
よりもいくつかの利点があります。
useReducer
を使用すると、状態更新ロジックをコンポーネントから分離して、テストとメンテナンスを容易にすることができます。還元剤関数は、状態がどのように変化するかを説明する純粋な関数であり、必要に応じて独自のファイルに分離できます。useReducer
、複数のサブ値を扱うとき、または次の状態が前の状態に依存するときに輝きます。州の更新を、より小さく、より管理しやすいアクションタイプに分割することができます。useCallback
とともにuseReducer
を使用してディスパッチ関数をメモ化し、パフォーマンスを改善する可能性があります。useReducer
、グローバル状態を管理するためのuseContext
とよくペアを組み、複数のコンポーネントでよりスケーラブルな状態管理ソリューションを可能にします。 useReducer
自体は副作用を直接処理しませんが、 useEffect
とペアリングして、状態の変更に基づいて副作用を効果的に管理できます。 useReducer
副作用の取り扱いを促進する方法は次のとおりです。
useReducer
使用して状態を管理することにより、すべての状態移行を1か所で定義できます。これにより、どの状態の変更が副作用を引き起こす可能性があるかを理解しやすくなります。useReducer
予測可能な状態の更新を保証するため、これらの更新に依存して、一貫した方法で副作用をトリガーすることができます。 useEffect
フックをセットアップして、特定の状態の変更を聞き、それに応じて副作用を実行できます。useEffect
フック内でuseReducer
が返品した状態を使用して、副作用をトリガーすることができます。たとえば、状態の変更にデータの取得が含まれている場合、状態を更新するためのアクションを発送でき、使用useEffect
フックはAPI呼び出しを行うことでこの状態の変更に応答できます。これが基本的な例です。
<code class="javascript">const [state, dispatch] = useReducer(reducer, initialState); useEffect(() => { if (state.fetchData) { // Fetch data here fetchData().then(data => dispatch({ type: 'dataFetched', payload: data })); } }, [state.fetchData]);</code>
この例では、 state.fetchData
真になると、 useEffect
フックがデータフェッチをトリガーし、データが取得されると、別のアクションを発送して、フェッチされたデータで状態を更新します。
Simple Todoリストアプリケーションを作成して、ReactコンポーネントでのuseReducer
の実際の実装を実証しましょう。
最初に、還元剤と初期状態を定義します。
<code class="javascript">// Reducer const todoReducer = (state, action) => { switch (action.type) { case 'ADD_TODO': return { ...state, todos: [...state.todos, { id: Date.now(), text: action.payload, completed: false }] }; case 'TOGGLE_TODO': return { ...state, todos: state.todos.map(todo => todo.id === action.payload ? { ...todo, completed: !todo.completed } : todo ) }; case 'REMOVE_TODO': return { ...state, todos: state.todos.filter(todo => todo.id !== action.payload) }; default: return state; } }; // Initial state const initialState = { todos: [] };</code>
次に、 useReducer
を使用するTodoList
コンポーネントを作成しましょう。
<code class="jsx">import React, { useReducer } from 'react'; const TodoList = () => { const [state, dispatch] = useReducer(todoReducer, initialState); const handleAddTodo = (text) => { dispatch({ type: 'ADD_TODO', payload: text }); }; const handleToggleTodo = (id) => { dispatch({ type: 'TOGGLE_TODO', payload: id }); }; const handleRemoveTodo = (id) => { dispatch({ type: 'REMOVE_TODO', payload: id }); }; return ( <div> <h1>Todo List</h1> <input type="text" onkeypress="{(e)"> { if (e.key === 'Enter') { handleAddTodo(e.target.value); e.target.value = ''; } }} placeholder="Enter a new todo" /> <ul> {state.todos.map(todo => ( <li key="{todo.id}"> <span style="{{" textdecoration: todo.completed : onclick="{()"> handleToggleTodo(todo.id)} > {todo.text} </span> <button onclick="{()"> handleRemoveTodo(todo.id)}>Remove</button> </li> ))} </ul> </div> ); }; export default TodoList;</code>
この例では、 useReducer
を使用して、TODOリストの状態を管理します。 todoReducer
関数は、 ADD_TODO
、 TOGGLE_TODO
、 REMOVE_TODO
3つのアクションタイプを処理します。 dispatch
関数は、還元剤にアクションを送信するために使用され、それに応じて状態を更新します。このアプローチにより、状態ロジックが集中化され、予測可能になり、コンポーネントの維持と理解が容易になります。
以上がusereducerとは何ですか?複雑な状態を管理するためにどのように使用しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。