React useReducer Hook(钩子)

useReducer 钩子类似于 useState

它允许自定义状态逻辑。

如果您发现自己跟踪依赖于复杂逻辑的多个状态,那么 useReducer 将会很有用。


语法

useReducer 钩子接受两个参数。

  1. useReducer(<reducer>, <initialState>)

reducer 函数包含自定义状态逻辑,initialState 可以是一个简单的值,但通常包含一个对象。

useReducer 钩子返回当前状态 statedispatch 方法。

下面是计数器应用程序中 useReducer 的一个示例:

Example:
  1. import { useReducer } from "react";
  2. import ReactDOM from "react-dom";
  3. const initialTodos = [
  4. {
  5. id: 1,
  6. title: "Todo 1",
  7. complete: false,
  8. },
  9. {
  10. id: 2,
  11. title: "Todo 2",
  12. complete: false,
  13. },
  14. ];
  15. const reducer = (state, action) => {
  16. switch (action.type) {
  17. case "COMPLETE":
  18. return state.map((todo) => {
  19. if (todo.id === action.id) {
  20. return { ...todo, complete: !todo.complete };
  21. } else {
  22. return todo;
  23. }
  24. });
  25. default:
  26. return state;
  27. }
  28. };
  29. function Todos() {
  30. const [todos, dispatch] = useReducer(reducer, initialTodos);
  31. const handleComplete = (todo) => {
  32. dispatch({ type: "COMPLETE", id: todo.id });
  33. };
  34. return (
  35. <>
  36. {todos.map((todo) => (
  37. <div key={todo.id}>
  38. <label>
  39. <input
  40. type="checkbox"
  41. checked={todo.complete}
  42. onChange={() => handleComplete(todo)}
  43. />
  44. {todo.title}
  45. </label>
  46. </div>
  47. ))}
  48. </>
  49. );
  50. }
  51. ReactDOM.render(<Todos />, document.getElementById("root"));

这正是跟踪 todo 完成状态的逻辑。

通过添加更多操作,所有添加、删除和完成 todo 的逻辑都可以包含在单个 useReducer 钩子中。

分类导航