Apabila membina aplikasi React, mengurus keadaan boleh menjadi rumit, terutamanya apabila berurusan dengan berbilang pembolehubah keadaan yang bergantung antara satu sama lain. Jika anda mendapati diri anda dalam situasi ini, sudah tiba masanya untuk meneroka kuasa useReducer Hook!
Apakah useReducer?
TheuseReducer Hook ialah alat yang berkuasa untuk menguruskan keadaan dengan cara yang boleh diramal. Ia membolehkan anda mengurus logik keadaan kompleks dengan cara yang bersih dan teratur, menjadikan kod anda lebih boleh diselenggara.
Sintaks
UseReducer Hook menerima dua hujah:
useReducer(reducer, initialState)
pengurang: Fungsi yang mengandungi logik keadaan tersuai anda.
initialState: Keadaan awal komponen anda, biasanya objek.
Cara Ia Berfungsi
1.Contoh:
Berikut ialah contoh mudah tentang cara menggunakan useReducer Hook untuk mengurus kaunter:
import React, { useReducer } from "react"; // Define the initial state const initialState = { count: 0 }; // Define the reducer function const reducer = (state, action) => { switch (action.type) { case "increment": return { count: state.count + 1 }; case "decrement": return { count: state.count - 1 }; default: return state; } }; function Counter() { const [state, dispatch] = useReducer(reducer, initialState); // Inline styles const containerStyle = { maxWidth: "400px", margin: "50px auto", padding: "20px", borderRadius: "10px", boxShadow: "0 4px 20px rgba(0, 0, 0, 0.2)", textAlign: "center", backgroundColor: "#ffffff", fontFamily: "'Roboto', sans-serif", }; const headingStyle = { fontSize: "2.5rem", margin: "20px 0", color: "#333333", }; const buttonStyle = { margin: "10px", padding: "12px 24px", fontSize: "1.1rem", border: "none", borderRadius: "5px", cursor: "pointer", transition: "background-color 0.3s, transform 0.3s", outline: "none", boxShadow: "0 2px 10px rgba(0, 0, 0, 0.1)", }; const incrementButtonStyle = { ...buttonStyle, backgroundColor: "#28a745", color: "white", }; const decrementButtonStyle = { ...buttonStyle, backgroundColor: "#dc3545", color: "white", }; // Hover and active styles const buttonHoverStyle = { filter: "brightness(1.1)", transform: "scale(1.05)", }; return ( <div style={containerStyle}> <h1 style={headingStyle}>Count: {state.count}</h1> <button style={incrementButtonStyle} onMouseOver={(e) => (e.currentTarget.style = { ...incrementButtonStyle, ...buttonHoverStyle, }) } onMouseOut={(e) => (e.currentTarget.style = incrementButtonStyle)} onClick={() => dispatch({ type: "increment" })} > Increment </button> <button style={decrementButtonStyle} onMouseOver={(e) => (e.currentTarget.style = { ...decrementButtonStyle, ...buttonHoverStyle, }) } onMouseOut={(e) => (e.currentTarget.style = decrementButtonStyle)} onClick={() => dispatch({ type: "decrement" })} > Decrement </button> </div> ); } export default Counter;
Output:
2.Contoh:
import React, { useReducer, useState } from "react"; // Define the initial state const initialState = { todos: [], }; // Define the reducer function const reducer = (state, action) => { switch (action.type) { case "ADD_TODO": return { ...state, todos: [...state.todos, action.payload] }; case "REMOVE_TODO": return { ...state, todos: state.todos.filter((todo) => todo.id !== action.payload), }; default: return state; } }; function TodoApp() { const [state, dispatch] = useReducer(reducer, initialState); const [inputValue, setInputValue] = useState(""); const handleAddTodo = () => { if (inputValue.trim()) { dispatch({ type: "ADD_TODO", payload: { id: Date.now(), text: inputValue }, }); setInputValue(""); // Clear input field } }; // Internal CSS const styles = { container: { maxWidth: "600px", margin: "50px auto", padding: "20px", borderRadius: "10px", boxShadow: "0 4px 20px rgba(0, 0, 0, 0.1)", backgroundColor: "#f9f9f9", fontFamily: "'Arial', sans-serif", }, heading: { textAlign: "center", fontSize: "2.5rem", marginBottom: "20px", color: "#333", }, input: { width: "calc(100% - 50px)", padding: "10px", borderRadius: "5px", border: "1px solid #ccc", fontSize: "1rem", marginRight: "10px", }, button: { padding: "10px 15px", fontSize: "1rem", border: "none", borderRadius: "5px", backgroundColor: "#28a745", color: "white", cursor: "pointer", transition: "background-color 0.3s", }, buttonRemove: { padding: "5px 10px", marginLeft: "10px", fontSize: "0.9rem", border: "none", borderRadius: "5px", backgroundColor: "#dc3545", color: "white", cursor: "pointer", transition: "background-color 0.3s", }, todoList: { listStyleType: "none", padding: 0, marginTop: "20px", }, todoItem: { display: "flex", justifyContent: "space-between", alignItems: "center", padding: "10px", borderBottom: "1px solid #ccc", backgroundColor: "#fff", borderRadius: "5px", marginBottom: "10px", }, }; return ( <div style={styles.container}> <h1 style={styles.heading}>Todo List</h1> <div style={{ display: "flex", justifyContent: "center" }}> <input style={styles.input} type="text" value={inputValue} onChange={(e) => setInputValue(e.target.value)} placeholder="Add a new todo" /> <button style={styles.button} onClick={handleAddTodo}> Add Todo </button> </div> <ul style={styles.todoList}> {state.todos.map((todo) => ( <li style={styles.todoItem} key={todo.id}> {todo.text} <button style={styles.buttonRemove} onClick={() => dispatch({ type: "REMOVE_TODO", payload: todo.id }) } > Remove </button> </li> ))} </ul> </div> ); } export default TodoApp;
Output:
UseReducerHook ialah tambahan yang sangat baik pada kit alat React anda. Ia memberi kuasa kepada anda untuk mengendalikan pengurusan keadaan yang kompleks dengan cekap, menjadikan aplikasi anda lebih mantap dan lebih mudah diselenggara. Cubalah dalam projek anda yang seterusnya dan bawa pengurusan negeri anda ke peringkat seterusnya!
Atas ialah kandungan terperinci Menguasai Pengurusan Negeri dengan useReducer Hook dalam React. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!