ReactJS - 新的 useState React 挂钩中的 prevState?
ReactJS - prevState in the new useState React hook?
我真的很喜欢新的 React hooks 并且我经常将它们用于我正在进行的项目。我遇到了一种情况,我想在 useState
挂钩中使用 prevState,但我不确定如何执行此操作。
我试过类似的方法,但编译失败。
const [ someState, setSomeState ] = useState( new Map() )
setSomeState( prevState.someState.set( key, value ) )
(顺便说一句,这是映射一个复选框数组以跟踪那些被选中的复选框)
我正在尝试遵循此示例 here,但未使用 setState
函数。
感谢您的帮助!
state updater
来自 useState
提供了一个回调模式,returns 您可以使用之前的状态更新当前状态
const [ someState, setSomeState ] = useState( new Map() )
setSomeState(prevState => prevState.set( key, value ) )
为了使用 Maps,您需要在操作值之前克隆它。否则,它会改变原始的 Map
而 React 不会处理可变的 state
.
const handleChange = useCallback(({ target: { name, checked } }) => {
setCheckbox(prevState => {
return new Map(prevState).set(name, checked);
});
}, []);
更新工作示例:
对于对象,您可以使用扩展运算符在 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>
你在析构变量中已经有之前的状态:someState
所以你可以这样做:
const [ someState, setSomeState ] = useState( new Map() )
setSomeState( someState.set( key, value ) )
使用这个
const [setSome, setSomeState] = useState({thing: 'loding', count: 1});
setSomeState(prev => ({...prev, count: prev.count + 1}));
我真的很喜欢新的 React hooks 并且我经常将它们用于我正在进行的项目。我遇到了一种情况,我想在 useState
挂钩中使用 prevState,但我不确定如何执行此操作。
我试过类似的方法,但编译失败。
const [ someState, setSomeState ] = useState( new Map() )
setSomeState( prevState.someState.set( key, value ) )
(顺便说一句,这是映射一个复选框数组以跟踪那些被选中的复选框)
我正在尝试遵循此示例 here,但未使用 setState
函数。
感谢您的帮助!
state updater
来自 useState
提供了一个回调模式,returns 您可以使用之前的状态更新当前状态
const [ someState, setSomeState ] = useState( new Map() )
setSomeState(prevState => prevState.set( key, value ) )
为了使用 Maps,您需要在操作值之前克隆它。否则,它会改变原始的 Map
而 React 不会处理可变的 state
.
const handleChange = useCallback(({ target: { name, checked } }) => {
setCheckbox(prevState => {
return new Map(prevState).set(name, checked);
});
}, []);
更新工作示例:
对于对象,您可以使用扩展运算符在 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>
你在析构变量中已经有之前的状态:someState
所以你可以这样做:
const [ someState, setSomeState ] = useState( new Map() )
setSomeState( someState.set( key, value ) )
使用这个
const [setSome, setSomeState] = useState({thing: 'loding', count: 1});
setSomeState(prev => ({...prev, count: prev.count + 1}));