Целый день гоняюсь за этим багом. У меня есть очень простая точка входа в React и очень простой пример изменения состояния компонента. Если я поставлю компонент в точку входа, вот так:
import React from 'react';
import { render } from 'react-dom';
export default class Template extends React.Component {
constructor(props) {
super(props);
this.toggleNavbar = this.toggleNavbar.bind(this);
this.state = {
collapsed: true,
};
}
toggleNavbar() {
this.setState({
collapsed: !this.state.collapsed,
});
}
render() {
return (
<div>
<p>Collapsed: { this.state.collapsed ? 'true' : 'false' }</p>
<button onClick={this.toggleNavbar}>Toggle</button>
</div>
);
}
}
render(
<Template />,
document.querySelector('#react-app'),
);
Он работает так, как ожидалось. Вы нажимаете кнопку переключения, и текст меняется между «истина» и «ложь». Однако в ту минуту, когда я разбиваю его на два отдельных файла, я получаю это в качестве точки входа:
import React from 'react';
import { render } from 'react-dom';
import Template from './components/Template';
render(
<Template />,
document.querySelector('#react-app'),
);
и это для Template.jsx
import React from 'react';
export default class Template extends React.Component {
constructor(props) {
super(props);
this.toggleNavbar = this.toggleNavbar.bind(this);
this.state = {
collapsed: true,
};
}
toggleNavbar() {
this.setState({
collapsed: !this.state.collapsed,
});
}
render() {
return (
<div>
<p>Collapsed: { this.state.collapsed ? 'true' : 'false' }</p>
<button onClick={this.toggleNavbar}>Toggle</button>
</div>
);
}
}
Каждый раз, когда я нажимаю на кнопку, я получаю следующую ошибку в консоли:
build.js:23484 Предупреждение: setState(...): Можно обновить только смонтированный или смонтированный компонент. Обычно это означает, что вы вызвали setState() для несмонтированного компонента. Это не-операция. Проверьте код компонента "Шаблон".
... Я проверил все другие ответы переполнения стека на предмет этой ошибки (а также обыскал тонну), и ни один из них, похоже, здесь не применим. Кто-нибудь знает, что я делаю неправильно?
примечание: я пытался добавить:
componentWillUnmount() {
this.isUnmounted = true;
}
и проверка !this.isUnmounted
перед setState()
, и я все еще получаю сообщение об ошибке.
Спасибо!
onClick={() => {this.toggleNavbar()}}
. Также добавьте расширение файла jsx в оператор импортаimport Template from './components/Template.jsx';
- person Fawaz   schedule 04.07.2017"plugins": ["react-hot-loader/babel"]
Я думаю, что произошло то, что каким-то образом конфликтовало с горячей перезагрузкой моего веб-пакета. В любом случае, его удаление решило проблему. - person Christopher Buecheler   schedule 04.07.2017