ReactJS - prevState in the new useState React hook?

Stu*_*t22 8 reactjs

I really like the new React hooks and I'm using them frequently for a project I'm working on. I'm coming across a situation where I want to use the prevState in the useState hook, but I'm not really certain on how to do this.

I've tried something like this, but it fails to compile.

const [ someState, setSomeState ] = useState( new Map() )
setSomeState( prevState.someState.set( key, value ) )
Run Code Online (Sandbox Code Playgroud)

(by the way, this is to map an array of checkboxes to keep track of the ones that are check marked)

I'm trying to follow this example here, but without using the setState function.

Thanks for the help!

Mat*_*tta 21

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

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

更新的工作示例

编辑多复选框处理程序


ppa*_*k10 11

对于对象,您可以prevStatesetState呼叫中使用价差运算符。

const [stateObject, setObjectState] = useState({
  firstKey: '',
  secondKey: '',
});

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

// stateObject = {
//   firstKey: '',
//   secondKey: 'value',
// }
Run Code Online (Sandbox Code Playgroud)

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

const [stateObject, setObjectState] = useState({
  firstKey: '',
  secondKey: '',
});

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

// stateObject = {
//   firstKey: '',
//   secondKey: 'value',
// }
Run Code Online (Sandbox Code Playgroud)
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")
);
Run Code Online (Sandbox Code Playgroud)

  • 我终于明白了如何将这个 prevstate 与这个片段一起使用。谢谢 (3认同)

Shu*_*tri 9

state updaterfrom useState提供了一种回调模式,该模式可返回您之前的状态,您可以使用该状态来更新当前状态

const [ someState, setSomeState ] = useState( new Map() )
setSomeState(prevState => prevState.set( key, value ) )
Run Code Online (Sandbox Code Playgroud)


Hos*_*deh 8

用这个

const [someState, setSomeState] = useState({thing: 'loading', count: 1});
setSomeState(prev => ({...prev, count: prev.count + 1}));
Run Code Online (Sandbox Code Playgroud)


Gio*_*gio 6

您已经在 destructed 变量中拥有先前的状态: someState

所以你可以这样做:

const [ someState, setSomeState ] = useState( new Map() )
setSomeState( someState.set( key, value ) )
Run Code Online (Sandbox Code Playgroud)