ReactJS - 新的 useState React 钩子中的 prevState?

新手上路,请多包涵

我真的很喜欢新的 React 钩子,并且我经常将它们用于我正在处理的项目中。我遇到了一种情况,我想在 useState 挂钩中使用 prevState ,但我不确定如何执行此操作。

我试过这样的东西,但它无法编译。

 const [ someState, setSomeState ] = useState( new Map() )
setSomeState( prevState.someState.set( key, value ) )

(顺便说一句,这是映射一组复选框以跟踪选中标记的复选框)

我在 这里 尝试遵循此示例,但不使用 setState 函数。

谢谢您的帮助!

原文由 Student22 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 691
2 个回答

为了使用 Maps ,您需要在操作值之前克隆它。否则,它会改变原始的 Map 并且 React 不能处理可变的 state

 const handleChange = useCallback(({ target: { name, checked } }) => {
  setCheckbox(prevState => {
    return new Map(prevState).set(name, checked);
  });
}, []);

更新的工作示例

编辑多复选框处理程序

原文由 Matt Carlotta 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于对象,您可以使用扩展运算符在您的 setState 调用中使用 prevState

 const [object, setObject] = useState({
  firstKey: '',
  secondKey: '',
});

setObject((prevState) => ({
  ...prevState,
  secondKey: 'value',
}));

// object = {
//   firstKey: '',
//   secondKey: 'value',
// }

下面的代码片段显示了使用 prevState 设置对象状态的示例。

 const {useState} = React;

const Example = ({title}) => {
  const initialState = {
    firstKey: 'empty',
    secondKey: 'empty',
    thirdKey: 'not empty',
  }
  const [object, setObject] = useState(initialState);

  const withPrevState = () => {
    setObject((prevState) => ({
      ...prevState,
      secondKey: 'not empty',
    }));
  }

  return (
    <div>
      <h5>Updates Second key to 'not empty'</h5>
      <p>First key: {object.firstKey}</p>
      <p>Second key: {object.secondKey}</p>
      <p>Third key: {object.thirdKey}</p>
      <button onClick={withPrevState}>
        Update with prevState
      </button>
      <button onClick={() => {setObject({secondKey: 'not empty'})}}>
        Update without prevState
      </button>
      <button onClick={() => {setObject(initialState)}}>
        Reset
      </button>
    </div>
  );
};

// Render it
ReactDOM.render(
  <Example />,
  document.getElementById("react")
);
 <script src="https://cdnjs.cloudflare.com/ajax/libs/react/16.8.4/umd/react.production.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react-dom/16.8.4/umd/react-dom.production.min.js"></script>
<div id="react"></div>

原文由 ppak10 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进