Как уже упоминали другие, причина того, что вы получаете бесконечный цикл, заключается в том, что вы обновляете состояние во время рендеринга, что вызывает повторный рендеринг, который снова обновляет состояние и т. Д.
Поскольку все, что вы пытаетесь сделать, это эффективно установить начальное состояние, нет необходимости использовать метод "setState" (или в вашем случае "setValues").
Просто выполните следующее:
const projectInfo = props.props.fieldwork;
const initialValues = {
fromDates: ' ',
};
if (projectInfo) {
for (let i = 0; i < projectInfo.length; i++) {
initialValues = { ...initialValues, fromDates: projectInfo[i].fromDate };
}
}
const [values, setValues] = React.useState(initialValues);
Однако в текущей реализации вы постоянно переопределяете значение «fromDates». Я подозреваю, что values
должен быть массивом объектов, каждый со своим собственным полем «fromDates». Например:
const projectInfo = props.props.fieldwork;
const initialValues = [{
fromDates: ' ',
}] // this is now an array
if (projectInfo) {
for (let i = 0; i < projectInfo.length; i++) {
initialValues.push({ fromDates: projectInfo[i].fromDate });
}
}
const [values, setValues] = React.useState(initialValues); // `values` will now have an array of objects [{ fromDate: ' ' }, { fromDate: 'Oct 14th, 2019' }, ...]
Наконец, если вы действительно хотите переопределить «fromDate» и все, что вас волнует, это последнее значение, то цикл вообще не нужен. Просто установите последнее значение в массиве projectInfo
:
const projectInfo = props.props.fieldwork;
const initialValues = {
fromDates: ' ',
};
if (projectInfo) {
initialValues.fromDates = projectInfo[projectInfo.length -1].fromDates;
}
const [values, setValues] = React.useState(initialValues);
Последнее решение было также упомянуто @Ghojzilla в комментариях.