【发布时间】:2018-03-20 00:36:58
【问题描述】:
当我执行以下代码时(参见下面的 sn-p),我收到警告:
警告:setState(...):只能更新已安装或正在安装的组件。这通常意味着您在未安装的组件上调用了 setState()。这是一个无操作。请检查 Blinker 组件的代码。
在我的 Mounter 类下的 componentWillUnmount() 方法中我做错了什么吗?谢谢!
class Blinker extends React.Component {
constructor(props) {
super();
this.state = {
appear: true
}
this.blinker = this.blinker.bind(this);
}
blinker() {
this.setState({appear: !this.state.appear });
}
componentDidMount() {
setInterval(this.blinker, 300)
}
render() {
return (
<div>
{ (this.state.appear) && "xxx" }
</div>
);
}
}
class Mounter extends React.Component {
constructor(props) {
super();
this.state = {
render: true
};
this.interval = null;
}
componentDidMount() {
this.interval = setTimeout( () =>
this.rendering(), 1500
);
}
componentWillUnmount() {
clearInterval(this.interval);
}
rendering() {
this.setState({ render: !this.state.render });
}
render() {
return (
<div>
<h1>
{ this.state.render && <Blinker /> }
</h1>
</div>
);
}
}
ReactDOM.render(<Mounter />, app);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="app"></div>
【问题讨论】:
-
您的 sn-p 不会发出警告。我不确定这是否相关,但您在
setTimeout函数上调用clearInterval。你的意思是打电话给clearTimeout吗?
标签: javascript reactjs ecmascript-6 components