#javascript #reactjs #destructuring #react-state
Вопрос:
Я деструктурирую переменную из состояния реакции в render() моего компонента класса следующим образом:
let { indexTabPoints } = this.state;
После этого я изменю его значение:
if (condition) { indexTabPoints = 1; console.log(indexTabPoints); // value's changing as it should }
А затем я передаю точки индексации в качестве поддержки другому компоненту:
lt;PointTab activeIndex={indexTabPoints} .... /gt;
После этого я проверяю значение activeIndex в компоненте PointTab и вижу старое значение (без каких-либо изменений).
Мне кажется, что React не обновляет опору, которую я передаю компоненту PointTab, всякий раз, когда она меняется или нет. Почему это происходит и как этого избежать, используя деструктурирование?
Отредактировано: Я только что заметил, что у меня есть несколько дочерних компонентов, а другой (в другом месте) говорил мне, что значение старое (потому что для него значение не изменилось). Спасибо всем вам, ребята, за помощь, простите мне мою беспечность.
Комментарии:
1. Пожалуйста, приведите минимальный неработающий пример, потому что код, который вы предоставляете, в порядке
2.
indexTabPoints = 1;
При каких обстоятельствах вы это делаете? Это только часть расчетов, в которых вы участвуетеrender()
? Или происходит какое-то событие (скажем, onClick), и вы пытаетесь обновить значение?3. На данный момент (для тестов) условие просто (верно), но на самом деле оно верно, когда некоторые другие переменные имеют нужные мне значения. Ничто не вычисляется в самом состоянии.
Ответ №1:
Реквизит неизменен
И вы не можете обновить состояние как indexTabPoints = 1;
, вместо этого вы можете сделать как this.setState((prev) =gt;({indexTabPoints: prev 1}))
, и вы не должны регистрировать значение состояний сразу после его установки, так как setState асинхронен во время работы консоли.журнал выполняется немедленно
Можете попробовать это (но только для отладки):
if (condition) { indexTabPoints = 1; setTimeout(() =gt; console.log(indexTabPoints), 1000); }
пример для отладки, чтобы понять, вызывается ли компонент перед условием if:
if (condition) { indexTabPoints = 1; console.log("in if condition" indexTabPoints); } render(){ return( { console.log(" in render" indexTabPoints) } lt;PointTab activeIndex={indexTabPoints} .... /gt;); }
Комментарии:
1. Да, но я использую деструктурированную переменную при передаче реквизита другому компоненту, а не само значение состояния, поэтому this.setState() изменит значение в состоянии, но не деструктурированную переменную, не так ли?
2. ДА. Условие «если» находится только в дочернем компоненте или только в родительском?
3. Только для родителей. А затем я проверяю переданное значение реквизита в начале дочернего компонента, без каких-либо «если».
4. Возможно, компонент вызывается до изменения значения, поэтому я бы предложил сослаться на приведенный выше пример для отладки
5. Ну, даже без setTimeout он показывает правильное значение (включая 1), но другой console.log (в компоненте, где я передал indext-точки) все равно регистрирует старое значение (не включая 1).