【问题标题】:What is the best or most efficient method for removing keys when setting state via React's useState hook?通过 React 的 useState 钩子设置状态时删除键的最佳或最有效的方法是什么?
【发布时间】:2019-04-29 21:01:11
【问题描述】:

我们的项目正在拥抱新的功能性 React 组件并大量使用各种钩子,包括 useState

与 React 类的 setState() 方法不同,useState() 返回的设置器完全替换状态而不是合并

当 state 是一个 map 并且我需要删除一个 key 时,我克隆现有 state,删除 key,然后设置新 state(如下所示)

[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);
  }

是否有更好的选择(更好地更高效和/或更标准)?

【问题讨论】:

标签: javascript reactjs ecmascript-6 react-hooks


【解决方案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 })
  }

【讨论】:

  • 有趣。你能解释一下const { [payload.id]: _, ...newState }; 行吗?看起来它是删除键的替代方法,但它似乎也只是将键设置为下划线(_),我认为这没有任何特殊含义。
  • 这是一种通过解构删除键的方法。我将 [payload.id] 解构为一个变量(我不必使用它,通常_ 是一个好名字),并通过其余语法获得新状态。这是一种非常常见的 redux 模式。
  • 谢谢。该模式(和评论)是我问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2020-01-26
  • 2022-09-28
相关资源
最近更新 更多