react 移除監聽事件無效


因為項目中使用iframe嵌入頁面,所以需要監聽message事件,但是發現無法removeEventListener,寫法如下:

    componentDidMount() {

        window.addEventListener("message", this.receiveMessage.bind(this))

    }

    componentDidUpdate() {

        this.receiveMessage()

    }

    componentWillUnmount() {

        window.removeEventListener("message", this.receiveMessage.bind(this));

        this.setState = () => {

            return

        }
    }

    receiveMessage = (event) => {

        if (event !== undefined) {
console.log('彈窗,我接受到了來自iframe的數據:', event.data); this.setState({ iframeData: event.data }) } };

原因就在於添加了bind(this)

更正之后:

    componentDidMount() {

        window.addEventListener("message", this.receiveMessage)

    }


    componentDidUpdate() {

        this.receiveMessage()

    }

    componentWillUnmount() {

        window.removeEventListener("message", this.receiveMessage);

        this.setState = () => {

            return

        }

    }



    receiveMessage = (event) => {

        if (event !== undefined) {

            console.log('彈窗,我接受到了來自iframe的數據:', event.data);

            this.setState({ iframeData: event.data })

        }

    };

 

 

另外遇到的問題:

 

 大致意思:不能對於一個已經卸載的組件上使用setState改變狀態,這將會造成應用的內存泄漏。

 

解決方案:

  componentWillUnmount() {
    this.setState = () => {
      return
    }
  }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM