开发者问题收集

如何使用 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>

    </>

)

>

Here is output

1个回答

实际上并不能保证 useState 管理的状态变量的内容在调用其 setter 后会立即更新。 eqtSizes 只会在下次渲染时与您传递给 setEqtSizes 的值同步。

请参阅 此常见问题解答

因此,预计您的第二条日志语句将显示过时的值。

Daan Reid
2021-06-24