繁体   English   中英

通过React的useState钩子设置状态时,删除键的最佳或最有效方法是什么?

[英]What is the best or most efficient method for removing keys when setting state via React's useState hook?

我们的项目正在拥抱新的功能性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);
  }

有没有更好的选择(更好的效率和/或标准)?

如果通过挂钩设置状态时需要更多控制,请查看useReducer挂钩

这个钩子的行为就像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 })
  }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM