reactjs - 用数组反应 useState 钩子
问题描述
我想做这样的东西。
- 当用户单击按钮时,项目应附加到数组中。
- 如果用户再次单击按钮,则应从数组中删除项目。
这样做的简单方法是什么?
const [state, setState] = useState([])
const [remove, setRemove] = useState(false)
const handleClick = e => {
if(!remove) {
setRemove(true)
setState(prev => [Date.now()])
}else{
setState(prev => prev.pop())
}
}
return(
<div>
{JSON.stringify(state)}
<button onClick={handleClick}>Click</button>
</div>
)
}
当我最初单击按钮时,它按预期工作。之后,当我尝试从数组中删除元素时,它显示出一种奇怪的行为。怎么了?
解决方案
setState
需要先复制prevState
,再修改。
您可以执行以下操作:
const {useState} = React;
const Root = () => {
const [state, setState] = useState([]);
const [remove, setRemove] = useState(false);
const handleClick = e => {
if(!remove) {
setRemove(true);
setState(prev => [Date.now()]);
}else{
const newState = [...state];
newState.pop();
setState(newState);
setRemove(false);
}
}
return(
<div>
{JSON.stringify(state)}
<button onClick={handleClick}>Click</button>
</div>
)
}
class App extends React.Component {
render() {
return (
<Root />
);
}
}
ReactDOM.render(<App />, document.getElementById('root'));
<html>
<body>
<div id="root"></div>
<script crossorigin src="https://unpkg.com/react@16/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"></script>
</body>
</html>