📅  最后修改于: 2023-12-03 15:39:38.486000             🧑  作者: Mango
在使用 map 函数更新状态时,可以结合使用 useReducer 函数,避免在多个组件中传递 props,并分离状态和业务逻辑。
useReducer
是 React 自带的一个 hook,用于全局状态管理。它是 useState
的替代方案,可以更好地处理复杂的状态逻辑。
useReducer()
接收两个参数:一个是 reducer 函数,一个是初始状态。reducer 函数接收两个参数:当前状态和一个 action 对象,返回新状态。
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
,返回新的状态。
通过结合使用 useReducer
和 map
函数,我们可以更好地管理状态和业务逻辑,避免了在多个组件中传递 props。同时,也可以提高代码的可复用性。