useReducer
adalah cangkuk React yang diperkenalkan dalam React 16.8 yang menyediakan cara alternatif untuk mengendalikan keadaan dalam komponen berfungsi. Ia amat berguna untuk menguruskan logik keadaan yang lebih kompleks dengan menggunakan fungsi reducer untuk mengemas kini keadaan. Fungsi reducer mengambil keadaan semasa dan tindakan sebagai hujah dan mengembalikan keadaan baru berdasarkan jenis tindakan. Pendekatan ini diilhamkan oleh Redux, perpustakaan pengurusan negeri yang popular, dan membantu mengekalkan kemas kini negeri yang dianjurkan dan diramalkan.
Sintaks untuk useReducer
adalah seperti berikut:
<code class="javascript">const [state, dispatch] = useReducer(reducer, initialArg, init);</code>
init
untuk mewujudkan keadaan awal malas.initialArg
sekali untuk menetapkan keadaan awal. Menggunakan useReducer
menawarkan beberapa faedah ke atas useState
semasa menguruskan keadaan kompleks, termasuk:
useReducer
, anda boleh memisahkan logik kemas kini keadaan dari komponen, menjadikannya lebih mudah untuk menguji dan mengekalkan. Fungsi reducer adalah fungsi tulen yang menggambarkan bagaimana perubahan keadaan, yang boleh dipisahkan ke dalam failnya sendiri jika diperlukan.useReducer
bersinar apabila berurusan dengan pelbagai sub-nilai atau apabila keadaan seterusnya bergantung pada yang sebelumnya. Ia membolehkan anda memecah kemas kini keadaan menjadi jenis tindakan yang lebih kecil dan lebih mudah diuruskan.useReducer
boleh digunakan dengan useCallback
untuk memoize fungsi penghantaran, yang berpotensi meningkatkan prestasi.useReducer
dengan baik dengan useContext
untuk menguruskan Negara Global, yang membolehkan penyelesaian pengurusan negeri yang lebih berskala merentasi pelbagai komponen. Walaupun useReducer
sendiri tidak mengendalikan kesan sampingan secara langsung, ia boleh dipasangkan dengan useEffect
untuk menguruskan kesan sampingan berdasarkan perubahan keadaan dengan berkesan. Begini bagaimana useReducer
dapat memudahkan pengendalian kesan sampingan:
useReducer
untuk menguruskan keadaan, anda boleh menentukan semua peralihan negeri di satu tempat. Ini menjadikannya lebih mudah untuk memahami perubahan keadaan mana yang mungkin mencetuskan kesan sampingan.useReducer
memastikan kemas kini keadaan yang boleh diramal, anda boleh bergantung kepada kemas kini ini untuk mencetuskan kesan sampingan secara konsisten. Anda boleh menyediakan cangkuk useEffect
untuk mendengar perubahan keadaan tertentu dan melaksanakan kesan sampingan dengan sewajarnya.useReducer
dalam cangkuk useEffect
untuk mencetuskan kesan sampingan. Sebagai contoh, jika perubahan keadaan melibatkan pengambilan data, anda boleh menghantar tindakan untuk mengemas kini keadaan, dan cangkuk useEffect
boleh bertindak balas terhadap perubahan keadaan ini dengan membuat panggilan API.Inilah contoh asas:
<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>
Dalam contoh ini, apabila state.fetchData
menjadi benar, cangkuk useEffect
mencetuskan data mengambil, dan apabila data diambil, ia menghantar tindakan lain untuk mengemas kini keadaan dengan data yang diambil.
Mari buat aplikasi Senarai Todo yang mudah untuk menunjukkan pelaksanaan praktikal useReducer
dalam komponen React.
Pertama, kita menentukan keadaan pengurangan dan permulaan kita:
<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>
Sekarang, mari buat komponen TodoList
yang menggunakan useReducer
:
<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>
Dalam contoh ini, kami menggunakan useReducer
untuk menguruskan keadaan senarai Todo kami. Fungsi todoReducer
mengendalikan tiga jenis tindakan: ADD_TODO
, TOGGLE_TODO
, dan REMOVE_TODO
. Fungsi dispatch
digunakan untuk menghantar tindakan kepada pengurangan, yang seterusnya mengemas kini keadaan dengan sewajarnya. Pendekatan ini menjadikan logik negeri berpusat dan boleh diramal, menjadikan komponen lebih mudah untuk mengekalkan dan memahami.
Atas ialah kandungan terperinci Apa itu UserEducer? Bagaimana anda menggunakannya untuk menguruskan keadaan kompleks?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!