【发布时间】:2018-05-03 19:25:09
【问题描述】:
这是我第一次面对这个警告信息。
无法在尚未安装的组件上调用 setState。
关注:
这是一个无操作,但它可能表明您的应用程序中存在错误。而是直接分配给
this.state或在 MyComponent 组件中定义具有所需状态的state = {};类属性。
“尚未安装”部分实际上几乎没有意义,因为触发问题的唯一方法是通过单击组件中的按钮来调用函数需要安装才能看到按钮。该组件在任何给定时间都不会卸载。
这个虚拟组件在我的应用中重现了错误:
import PropTypes from 'prop-types'
import React from 'react'
export default class MyComponent extends React.Component {
constructor (props) {
super(props)
this.state = {
initial: 'state'
}
this.clickMe = this.clickMe.bind(this)
}
clickMe () {
this.setState({
some: 'new state'
})
}
render () {
return (
<div>
<button onClick={this.clickMe}>click</button>
</div>
)
}
}
我正在使用:
"react": "16.3.2",
"react-dom": "16.3.2",
"mobx": "4.2.0",
"mobx-react": "5.1.2",
我在最新的 React/mobx 版本中遗漏了什么吗? (注意该组件不使用任何与 mobx 相关的东西,但它的父级是 mobx-react 观察者)
编辑:
肯定有与组件实例相关的东西,进一步调查表明,在某些情况下,在渲染函数内部创建处理程序会使该警告消失,但并非在所有情况下。
class MyComponent extends React.component {
constructor (props) {
// ...
this.clickMeBound = this.clickMe.bind(this)
}
clickMe () {
...
}
render () {
// works
<button onClick={() => {this.clickMe()}}>click arrow in render</button>
// warning: Can't call setState on a component that is not yet mounted.
<button onClick={this.clickMeBound}>click bound</button>
}
}
编辑 2:
我已经从我的 Webpack 配置中的条目中删除了“react-hot-loader/patch”,并且像这样的一些奇怪问题已经消失。我没有将此作为答案,因为错误消息本身仍然很奇怪,这会导致控制台中出现警告。不过一切正常。
【问题讨论】:
-
您是否尝试过添加
componentWillUnmount函数并100% 确保您的组件没有被卸载?如果它正在卸载,则问题不在您的组件中。 -
是的,这就是我所说的“组件在任何给定时间都没有卸载”的意思。
-
您的代码似乎完全有效,绑定后可能有双括号?
bind()()? -
我现在没有时间证明,但可能与使用react hot loader有关。我从我的 webpack 配置中的条目中删除了“react-hot-loader/patch”,一些奇怪的问题消失了。
标签: javascript reactjs mobx mobx-react