#reactjs #react-admin #react-final-form #final-form
#reactjs #реагировать-администратор #реакция-окончательная форма #окончательная форма
Вопрос:
Мне нужно установить постоянное значение useState
, используя хук FormDataConsumer
. Это необходимо, потому что значение const может быть получено только внутри FormDataConsumer
. Это постоянное значение будет использоваться в качестве опоры для другого компонента. Проблема, с которой я сталкиваюсь, заключается в сообщении об ошибке ниже. Каков наилучший способ сделать это? Заранее спасибо
Ошибка: превышена максимальная глубина обновления. Это может произойти, когда компонент повторно вызывает
setState
внутриcomponentWillUpdate
илиcomponentDidUpdate
. React ограничивает количество вложенных обновлений, чтобы предотвратить бесконечные циклы.
//const initialized here
const [outletsList, setOutletsList] = useState([]);
//the place where the const must be set
<FormDataConsumer>
{({ formData, ...rest }) => {
//console.log(`formData: ${JSON.stringify(formData)}`)
//console.log(`rest: ${JSON.stringify(rest)}`)
let s = GetOutletsBySalesRep({
distributorkey: formData.distributorid,
salesrep: formData.salesrep,
});
**setOutletsList(s);**
}}
</FormDataConsumer>
Ответ №1:
Ошибка, которую вы получаете, связана с тем, как работает сам React — вы обновляете переменную состояния, которая переводит компонент в повторный рендеринг, и при каждом рендеринге вы снова устанавливаете состояние … таким образом, вы попадаете в бесконечный цикл.
Чтобы избежать этого, вы должны либо установить условие, при котором состояние будет обновляться, например
if(outletsList.length === 0) setOutletsList(s);
Или используйте ссылку для сохранения результата с помощью useRef
перехвата, обновляющего его текущее свойство, потому что эта операция не запускает повторный запуск.
const outletsListRef = useRef();
...
outletsListRef.current = s;
Хотя не уверен, почему вам нужно сохранить его, а не повторно отображать компонент.