我有这样的反应的高阶组件:
export default function (InnerComponent) {
class InfiniteScrolling extends React.Component {
constructor(props){
super(props);
}
componentDidMount() {
window.addEventListener('scroll', this.onScroll.bind(this), false);
}
componentWillUnmount() {
window.removeEventListener('scroll', this.onScroll.bind(this), false);
}
onScroll() {
if ((window.innerHeight + window.scrollY) >= (document.body.offsetHeight - 50)) {
const { scrollFunc } = this.props;
scrollFunc();
}
}
render() {
return <InnerComponent {...this.props} />;
}
}
InfiniteScrolling.propTypes = {
scrollFunc: PropTypes.func.isRequired
};
return InfiniteScrolling;
}
卸载通过 InfiniteScrolling
包装的组件后,它们仍然抛出错误(当我滚动时):
警告:setState(…):只能更新已安装或安装的组件。这通常意味着您在未安装的组件上调用了 setState() 。这是一个空操作。请检查未定义组件的代码。
即使我确实删除了组件卸载上的 scroll
事件。它没有用。
但是当我将代码更改为这样时:
constructor(props){
super(props);
this.onScroll = this.onScroll.bind(this);
}
componentDidMount() {
window.addEventListener('scroll', this.onScroll, false);
}
componentWillUnmount() {
window.removeEventListener('scroll', this.onScroll, false);
}
一切似乎都运行良好,没有任何问题。
我觉得它们是完全一样的东西,但是第二个工作正常,而第一个在控制台中抛出错误,如前所述!
原文由 Ant‘s 发布,翻译遵循 CC BY-SA 4.0 许可协议
.bind
总是创建一个新函数,所以你需要像下面那样做,所以它添加和删除了相同的函数。