我们的项目正在拥抱新的功能性React组件,并大量使用了各种钩子,包括useState
。
与React类的setState()
方法不同,useState()返回的setter完全替换状态,而不是合并。
当状态为地图并且我需要删除密钥时,我克隆现有状态,删除密钥,然后设置新状态(如下所示)
[errors, setErrors] = useState({})
...
const onChange = (id, validate) => {
const result = validate(val);
if (!result.valid) {
setErrors({
...errors,
[fieldId]: result.message
})
}
else {
const newErrors = {...errors};
delete newErrors[id];
setErrors(newErrors);
}
是否有更好的选择(更好的效率和/或标准)?
答案 0 :(得分:1)
如果通过挂钩设置状态时需要更多控制,请查看useReducer
hook。
此钩子的行为就像redux中的reducer一样-一个接收当前状态和一个动作的函数,并根据该动作转换当前状态以创建新状态。
示例(未经测试):
const reducer = (state, { type, payload }) => {
switch(type) {
case 'addError':
return { ...state, ...payload };
case 'removeError':
const { [payload.id]: _, ...newState };
return newState;
default:
return state;
}
};
const [state, dispatch] = useReducer(reducer, {});
...
const onChange = (id, validate) => {
const result = validate(val);
if (!result.valid) {
dispatch({ type: 'addError', payload: { [id]: result.message }})
}
else {
dispatch({ type: 'removeError', payload: id })
}