警告:setState(...):只能更新已安装或安装的组件。这通常意味着您在已卸载的组件上调用了setState()。这是一个无操作。
我已经在Stack Overflow上阅读了很多这些解决方案,但我仍然完全不知道为什么会发生这种情况以及如何解决这个问题。
我有我的图表组件,它被渲染为页面,组件已安装。当我将鼠标悬停在我的图表值(onValueMouseOver)上时,就是我收到错误的时候。我只是不明白如果我能够将鼠标放在它上面,我的组件被认为是不安装的。
我尝试创建一个单独的this.mounted
变量,我将其设置为true / false,取决于componentWillMount
和componentWillUnmount
,并且仅当setState
为真时才使用class Chart extends Component {
constructor(props) {
super(props);
this.mounted = false;
this.state = {
value: null
};
this.rememberValue = this.rememberValue.bind(this);
this.forgetValue = this.forgetValue.bind(this);
}
componentWillMount() {
console.log('mounting');
this.mounted = true;
}
componentWillUnmount() {
console.log('unmounting');
this.mounted = false;
}
rememberValue(value) {
console.log(this.mounted);
if (this.mounted) {
this.setState({value});
}
}
forgetValue() {
console.log(this.mounted);
if (this.mounted) {
this.setState({
value: null
});
}
}
render() {
const { series } = this.props;
const { value } = this.state;
return (
<XYPlot />
<LineMarkSeries
data={series.data}
onValueMouseOver={this.rememberValue}
onValueMouseOut={this.forgetValue}
/>
<XAxis />
<YAxis />
{value && <Hint value={value} {...this.props} />}
</XYPlot>
);
}
}
。下面的代码输出“挂载”消息(从不是“卸载”消息),但是在启动时它输出到控制台的值为“true”,我假设因为我在构造函数中绑定了这些方法。但是当我鼠标悬停时,会记录“false”。它不记录错误,但仍然没有设置值,我需要它。
在指导我采用“正确的方式”来处理这种情况时,我们将不胜感激。我一直在几个地方使用这种方法,在更新我的一些libs和webpack配置之前,他们都习惯了。
这是我的代码。我正在使用react-vis。
encoding="ISO-8859-1"
答案 0 :(得分:0)
Omar的解决方案是正确的,但是某些短信可能会因为在渲染函数中创建匿名函数而感到生气(出于性能原因)。您还有另外两个性能更高的选项。
forgetValue = () => {
}
或
constructor() {
this.forgetValue = this.forgetValue.bind(this)
}
两者都只会生成将在组件的整个生命周期中使用的函数的一个实例。在处理程序中创建一个函数,每次重新渲染时都会创建一个新的实例。