简单的React组件状态,setState(...):只能更新已安装或安装的组件

时间:2018-04-06 17:24:00

标签: javascript reactjs

  

警告:setState(...):只能更新已安装或安装的组件。这通常意味着您在已卸载的组件上调用了setState()。这是一个无操作。

我已经在Stack Overflow上阅读了很多这些解决方案,但我仍然完全不知道为什么会发生这种情况以及如何解决这个问题。

我有我的图表组件,它被渲染为页面,组件已安装。当我将鼠标悬停在我的图表值(onValueMouseOver)上时,就是我收到错误的时候。我只是不明白如果我能够将鼠标放在它上面,我的组件被认为是不安装的。

我尝试创建一个单独的this.mounted变量,我将其设置为true / false,取决于componentWillMountcomponentWillUnmount,并且仅当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"

1 个答案:

答案 0 :(得分:0)

Omar的解决方案是正确的,但是某些短信可能会因为在渲染函数中创建匿名函数而感到生气(出于性能原因)。您还有另外两个性能更高的选项。

forgetValue = () => {
}

constructor() {
  this.forgetValue = this.forgetValue.bind(this)
}

两者都只会生成将在组件的整个生命周期中使用的函数的一个实例。在处理程序中创建一个函数,每次重新渲染时都会创建一个新的实例。