Когда у меня есть класс кнопки "DrawButton", у которого есть этот рендер
render() {
return(
<Button
onClick={this.props.toggleDraw.bind(this)}
style={{
backgroundColor: this.props.drawMode ? 'red' : 'blue'
}}
>
Draw
</Button>
);
}
И в родительском App.js состояние определяется
state = {
drawMode: false
}
И есть функция-обработчик
toggleDraw = (e) => {
console.log('App.js drawMode:' + this.state.drawMode);
this.setState({
drawMode: !this.state.drawMode
});
console.log('App.js drawMode:' + this.state.drawMode);
}
И наконец кнопка:
render() {
return (
<div className="App">
<DrawButton
toggleDraw={this.toggleDraw}
drawMode={this.state.drawMode}
/>
</div>
);
}
Состояние не обновляется должным образом. Он выводит следующее:
Сначала нажмите кнопку
App.js drawMode:false
App.js:27
App.js drawMode:false
App.js:31
Перед запуском setState drawMode имеет значение false, после запуска setState, drawMode все еще остается false.
Но кнопка по-прежнему имеет красный фон.
Второй щелчок по кнопке:
App.js drawMode:true
App.js:22
App.js drawMode:true
App.js:26
Но кнопка снова синего цвета despise drawMode в состоянии установлено значение true.
Почему происходит это несоответствие?
1 ответ
Во-первых, ваш bind
использовался неправильно, в вашем DrawButton
обработчике onClick просто вызовите this.props.toggleDraw
. Этот код: this.props.toggleDraw.bind(this)
должен быть в конструкторе файла App.js
.
Во-вторых, не используйте console.log
для проверки значения состояния после настройки, поскольку функция setState
работает асинхронно, используйте обратный вызов setState
для проверки значения после настройки:
toggleDraw = (e) => {
console.log('App.js drawMode:' + this.state.drawMode);
this.setState(
{ drawMode: !this.state.drawMode },
() => console.log('App.js drawMode:' + this.state.drawMode)
),
}
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.
setState
является асинхронным, поэтому он не будет изменен в следующей строке кода при регистрации..bind(this)
не в том месте, оно должно быть в родительском, а не в дочернем элементе.