【发布时间】:2016-09-20 11:50:39
【问题描述】:
我在控制台中收到此错误/警告:
setState(...): 只能更新一个挂载或挂载的组件。
编辑安装组件
这里是我安装组件的地方:
componentDidMount()
{
if (this.isVisible()) {
this.setState({visible: true});
}
this.bindEventListeners();
}
这是导致问题的代码:
bindEventListeners()
{
let visibilityEvent = function (event) {
event.currentTarget.removeEventListener(event.type, visibilityEvent);
// protect the component against unloading
if (this.isVisible()) {
this.setState({visible: true});
}
// no need to call the timeout when its already visible
if (!this.state.visible) {
let scrollEvnt = setTimeout(function () {
EventContainer.readWindowEvent('scroll', visibilityEvent);
}, 100);
this.setState({scrollEv: scrollEvnt});
}
}.bind(this);
EventContainer.readWindowEvent('scroll', visibilityEvent);
}
更准确地说,这一行:
this.setState({scrollEv: scrollEvnt});
如果我理解正确,这意味着我需要一种方法来卸载滚动事件。但我不确定这是否可能。我很确定你不能在(vanilla)javascript/React 中取消绑定滚动事件。
编辑2 isVisible函数
isVisible()
{
let isVisible = true;
try {
let heightElement = ReactDOM.findDOMNode(this).getBoundingClientRect().top;
isVisible = heightElement - window.innerHeight < 0;
} catch (error) {
console.warn('Falling back');
}
return isVisible;
}
我可能错了,但我不确定如何解决此警告/错误。也许有人可以帮助我?任何帮助表示赞赏:)
非常感谢!
【问题讨论】:
-
该错误表示您在组件挂载之前调用了
setState函数。 -
@AsafDavid 感谢您的回复,但我不确定如何解决。我添加了我的 componentDidMount 函数,如果需要,可以查看已编辑的 OP :)
-
你可能需要处理 componentWillUnmount 并移除那里的事件监听器
-
@Tom 感谢您的回答!我知道这一点,但我不确定是否可以删除滚动事件侦听器
-
你可以移除一个滚动事件监听器,是的
标签: javascript reactjs