如何使用 React 中的 useState 钩子将保存状态的对象推送到状态数组中?
2021-06-24
155
因此,我需要为这个问题提供尽可能多的动态解决方案。 我有两个状态(字符串),它们需要作为对象的值。 然后我必须将该对象推送到数组中,并将该数组的状态设置为新值。
我已经设法做到了,但出了点问题,每次我用扩展运算符将对象添加到数组时,状态首先为空,然后开始添加先前的值,而不是当时插入的值。 导出默认函数 EqtConnect() {
let allSizes = [];
const [eqt_ID, setEqtID] = useState('');
const [eqtSizes, setEqtSizes] = useState([]);
const [sizeID, setSizeID] = useState(null);
const [sizeAmout, setSizeAmont] = useState(null);
/**
* Token
*/
const { token } = useToken();
/**
* Styles
*/
const classes = useStyles();
/**
* handleSubmit function handle submit to API
* @param {event object} e
*/
const handleSubmit = (e) => {
e.preventDefault();
console.log('Na submit ', eqtSizes)
sendData({
eqt_ID,
eqtSizes,
token,
});
}
const addSize = (el) => {
console.log(sizeID, sizeAmout); // Console logs good output
setEqtSizes([...eqtSizes, { 'equipment_size_id': sizeID, 'quantity': sizeAmout }]);
// First time output is [ { 'equipment_size_id': undefined, 'quantity': undefined }]
// Second time output is [ { 'equipment_size_id': '--- previous value ---, 'quantity': --- previous value --- }]
console.log('State of array', eqtSizes);
}
return (
<>
<Grid container spacing={3}>
<Grid item xs={12}>
<Paper className={classes.paper}>
<h1>Equipment</h1>
<Typography>
Connect Data
</Typography>
</Paper>
</Grid>
<Grid item xs={12} sm={12}>
<form action="" onSubmit={(e) => handleSubmit(e)} id="send-image">
<Paper className={classes.paper}>
<Grid container spacing={3}>
<Grid item xs={12} sm={12}>
<TextField id="bikePrice" name="price" label="ID Opreme" onChange={(e) => setEqtID(e.target.value)} />
</Grid>
<Grid item xs={12} sm={12}>
<Box className="input-holder">
<input type="number" name="sizeID" id="sizeID" onChange={e => setSizeID(parseInt(e.target.value))} />
<input type="number" placeholder="Kolicina" onChange={e => setSizeAmont(parseInt(e.target.value))} />
<span className="add-button" onClick={(e) => addSize(e.target)} >+</span>
</Box>
</Grid>
</Grid>
</Paper>
<br />
<Grid item xs={12} sm={12}>
<Button type="submit" variant="contained" color="primary">
Update
</Button>
</Grid>
</form>
</Grid>
</Grid>
</>
)
>
1个回答
实际上并不能保证
useState
管理的状态变量的内容在调用其 setter 后会立即更新。
eqtSizes
只会在下次渲染时与您传递给
setEqtSizes
的值同步。
请参阅 此常见问题解答 。
因此,预计您的第二条日志语句将显示过时的值。
Daan Reid
2021-06-24