📜  我们如何在 map 函数中使用 usefef - Javascript (1)

📅  最后修改于: 2023-12-03 15:39:38.486000             🧑  作者: Mango

使用 useReducer函数 在 map 函数中

在使用 map 函数更新状态时,可以结合使用 useReducer 函数,避免在多个组件中传递 props,并分离状态和业务逻辑。

什么是 useReducer 函数?

useReducer 是 React 自带的一个 hook,用于全局状态管理。它是 useState 的替代方案,可以更好地处理复杂的状态逻辑。

useReducer() 接收两个参数:一个是 reducer 函数,一个是初始状态。reducer 函数接收两个参数:当前状态和一个 action 对象,返回新状态。

在 map 函数中使用 useReducer
function App() {
  const [state, dispatch] = useReducer(reducer, initialState);

  return (
    <>
      {state.map((item, index) => (
        <Item key={index} item={item} dispatch={dispatch} />
      ))}
    </>
  );
}

function Item({ item, dispatch }) {
  const handleClick = () => {
    dispatch({ type: 'toggle', id: item.id });
  };

  return (
    <div
      style={{
        textDecoration: item.completed ? 'line-through' : 'none',
      }}
    >
      <input type="checkbox" checked={item.completed} onChange={handleClick} />
      <span>{item.text}</span>
    </div>
  );
}

function reducer(state, action) {
  switch (action.type) {
    case 'toggle':
      return state.map(item =>
        item.id === action.id ? { ...item, completed: !item.completed } : item
      );
    default:
      return state;
  }
}

const initialState = [
  { id: 1, text: 'Learn React', completed: false },
  { id: 2, text: 'Learn Hooks', completed: false },
  { id: 3, text: 'Build something awesome', completed: false },
];
解释

上述代码展示了如何使用 useReducer 在 map 函数中处理状态。在 App 组件中使用 useReducer 定义了一个状态 state 和一个 dispatch 函数用于更新状态。然后将 state 映射为 Item 组件,同时传入 dispatch 函数。

Item 组件中,通过调用 dispatch 函数触发 reducer 函数更新状态。在 reducer 函数中根据传入的 id,返回新的状态。

总结

通过结合使用 useReducermap 函数,我们可以更好地管理状态和业务逻辑,避免了在多个组件中传递 props。同时,也可以提高代码的可复用性。