Итак, у меня есть это:
let total = newDealersDeckTotal.reduce(function(a, b) {
return a + b;
},
0);
console.log(total, 'tittal'); //outputs correct total
setTimeout(() => {
this.setState({dealersOverallTotal: total});
}, 10);
console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); //outputs incorrect total
newDealerDeckTotal - это просто массив чисел, [1, 5, 9]
например, но this.state.dealersOverallTotal
не дает правильной суммы, но total
дает? Я даже поставил задержку тайм-аута, чтобы увидеть, решило ли это проблему. какие-нибудь очевидные или я должен разместить больше кода?
javascript
reactjs
state
setstate
Червь
источник
источник
setState
.setState
действительно выполняется после регистрации состояния. Я думаю, что вы имели в виду при отладке поместитьconsole.log
часть внутрь таймаута иsetState
снаружи.Ответы:
setState()
обычно является асинхронным, что означает, что на моментconsole.log
создания состояния оно еще не обновлено. Попробуйте поместить журнал в обратный вызовsetState()
метода. Он выполняется после завершения изменения состояния:this.setState({ dealersOverallTotal: total }, () => { console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); });
источник
setState
.this.setState({someVar: newValue},function(){ console.log("force update") });
setState является асинхронным. Вы можете использовать метод обратного вызова, чтобы получить обновленное состояние.
changeHandler(event) { this.setState({ yourName: event.target.value }, () => console.log(this.state.yourName)); }
источник
Использование async / await
async changeHandler(event) { await this.setState({ yourName: event.target.value }); console.log(this.state.yourName); }
источник
setState()
Операция асинхронная и , следовательно , вашconsole.log()
будет выполняться доsetState()
мутирует значения и , следовательно , вы видите результат.Чтобы решить эту проблему, зарегистрируйте значение в функции обратного вызова
setState()
, например:setTimeout(() => { this.setState({dealersOverallTotal: total}, function(){ console.log(this.state.dealersOverallTotal, 'dealersOverallTotal1'); }); }, 10)
источник
В случае крючков следует использовать
useEffect
крючок.const [fruit, setFruit] = useState(''); setFruit('Apple'); useEffect(() => { console.log('Fruit', fruit); }, [fruit])
источник
useEffect
выполняется при каждом повторном рендеринге, и если элементы, переданные в массив, являются переменными состояния, песком изменяются. Итак, когда фрукт изменится и компонент будет повторно отрисован, этот useEffect запустится.Setstate является асинхронным в реакции, поэтому, чтобы увидеть обновленное состояние в консоли, используйте обратный вызов, как показано ниже (функция обратного вызова будет выполняться после обновления setstate)
Приведенный ниже метод «не рекомендуется», но для понимания, если вы изменяете состояние напрямую, вы можете увидеть обновленное состояние в следующей строке. Повторяю, это «не рекомендуется»
источник
просто добавьте
componentDidUpdate(){}
метод в свой код, и он будет работать. вы можете проверить жизненный цикл react native здесь:https://images.app.goo.gl/BVRAi4ea2P4LchqJ8
источник
У меня была такая же ситуация с запутанным кодом, и ничто из существующих предложений не помогло мне.
Моя проблема заключалась в том, что
setState
это происходило из функции обратного вызова, выпущенной одним из компонентов. И меня подозрительно то, что вызов происходил синхронно, чтоsetState
вообще не позволяло установить состояние.Проще говоря, у меня что-то вроде этого:
render() { <Control ref={_ => this.control = _} onChange={this.handleChange} onUpdated={this.handleUpdate} /> } handleChange() { this.control.doUpdate(); } handleUpdate() { this.setState({...}); }
Как я должен был «исправить» это было положить
doUpdate()
вsetTimeout
так:handleChange() { setTimeout(() => { this.control.doUpdate(); }, 10); }
Не идеально, но в противном случае это был бы значительный рефакторинг.
источник
У меня возникла проблема при настройке состояния реакции несколько раз (всегда использовалось состояние по умолчанию). После этой проблемы с реакцией / github у меня сработало
const [state, setState] = useState({ foo: "abc", bar: 123 }); // Do this! setState(prevState => { return { ...prevState, foo: "def" }; }); setState(prevState => { return { ...prevState, bar: 456 }; });
источник