Я читаю раздел формreactjsдокументацию и только что попробовал этот код, чтобы продемонстрировать onChange
использование ( JSBIN ).
var React= require('react');
var ControlledForm= React.createClass({
getInitialState: function() {
return {
value: "initial value"
};
},
handleChange: function(event) {
console.log(this.state.value);
this.setState({value: event.target.value});
console.log(this.state.value);
},
render: function() {
return (
<input type="text" value={this.state.value} onChange={this.handleChange}/>
);
}
});
React.render(
<ControlledForm/>,
document.getElementById('mount')
);
Когда я обновляю <input/>
значение в браузере, вторая console.log
внутри handleChange
обратного вызова печатается так же, value
как и первая. console.log
Почему я не вижу результат this.setState({value: event.target.value})
в области handleChange
обратного вызова?
javascript
reactjs
react-jsx
tarrsalah
источник
источник
Ответы:
Из документации React :
Если вы хотите, чтобы функция выполнялась после изменения состояния, передайте ее как обратный вызов.
источник
componentDidUpdate
. Он будет вызван после изменения состояния.shouldComponentUpdate
этом случае не указано иное. Что именно вы пытаетесь сделать в обратном вызове, который вы передаете,setState
который вы хотите выполнить перед повторным рендерингом?Как упомянуто в документации React, нет гарантии
setState
синхронного запуска, поэтому выconsole.log
можете вернуть состояние до его обновления.Майкл Паркер упоминает прохождение обратного вызова в
setState
. Другой способ обработки логики после изменения состояния - этоcomponentDidUpdate
метод жизненного цикла, который рекомендуется в документах React.Это особенно полезно, когда могут быть
setState
запущены последовательно , и вы хотели бы запускать ту же функцию после каждого изменения состояния. Вместо добавления обратного вызова к каждомуsetState
, вы можете поместить функцию внутриcomponentDidUpdate
, с определенной логикой внутри, если это необходимо.источник
Вы можете попробовать использовать ES7 async / await. Например, используя ваш пример:
источник
setState
является асинхронным, но ничего не возвращает , поэтомуawait
будет работать большую часть времени, но только случайно, так как это условие гонки.Остерегайтесь методов жизненного цикла реакции!
Я работал несколько часов, чтобы выяснить, что
getDerivedStateFromProps
будет звонить после каждогоsetState()
.😂
источник
async-await
синтаксис отлично работает для чего-то вроде следующего ...источник
Пожалуйста, прочитайте о цикле событий, чтобы иметь четкое представление об асинхронной природе в JS и почему требуется время для обновления -
Отсюда -
как требуется время, чтобы обновить. Для достижения вышеуказанного процесса -
источник