反应警告setState(...):只能更新已安装或安装的组件

时间:2016-09-20 11:50:40

标签: javascript reactjs

我在控制台中收到此错误/警告:

  

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});

如果我理解正确,则意味着我需要一种方法来卸载滚动事件。但我不确定这是否可行。我很确定你无法在(香草)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;
    }

我可能错了,但我不确定如何解决此警告/错误。也许有人可以帮助我?任何帮助表示赞赏:)

非常感谢提前!

2 个答案:

答案 0 :(得分:0)

我认为我们可能需要看到更多的代码来解决这个问题。

几个问题:

  • 你确定你没有从其他地方调用bindEventListeners()吗?
  • 当你拥有this.isVisible()时为什么需要“this.state.visible”?

This diagram has helped me a lot in keeping track of where everything happens in a react object's lifecycle

答案 1 :(得分:0)

您需要删除{ a: ['foo', 'bar', 'root', 'data'], b: ['foo', 'bar', 'root', 'data'] }

中的滚动事件侦听器

以下内容应该有效:

componentWillUnmount