为了账号安全,请及时绑定邮箱和手机立即绑定

React如何移除事件监听?

React如何移除事件监听?

炎炎设计 2019-03-25 11:28:58
问题描述1、在组件加载时,利用生命周期componentDidMount中添加事件监听。但在组件卸载时,在componentWillUnmount中无法移除事件2、而在Angular框架中,就是采用在组件卸载时移除事件就可以成功,而在React中此思路完全失效,为什么会有这种差异?React版本信息相关代码class Product extends Component {     constructor() {        super();     }    // 组件加载时     componentDidMount() {        this.scrollEvent();     }    // 组件卸载时     componentWillUnmount() {         window.removeEventListener("scroll", this.onScroll.bind(this));     }    // 添加事件监听     scrollEvent() {         window.addEventListener("scroll", this.onScroll.bind(this));     }    // 事件监听方法     onScroll() {         console.log("滚动条正在滚动");     } }你期待的结果是什么?实际看到的错误信息又是什么?1、期望结果是:在组件完成卸载时,移除事件监听,onScroll方法停止执行输出"滚动条正在滚动"字符串2、实际结果是:当前组件已经卸载,已经进入到另一个组件时,onScroll方法仍然在执行输出"滚动条正在滚动"字符串
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

bind()会创建一个新的函数,所以示例中添加和解除绑定的不是同一个函数:

function a () {}
a === a  // truea.bind(this) === a.bind(this)  // false

在 constructor 中绑定 this:

class Product extends Component {
    constructor() {        super();        this.onScroll = this.onScroll.bind(this)
    }    // 组件加载时
    componentDidMount() {        this.scrollEvent();
    }    // 组件卸载时
    componentWillUnmount() {
        window.removeEventListener("scroll", this.onScroll);
    }    // 添加事件监听
    scrollEvent() {
        window.addEventListener("scroll", this.onScroll);
    }    // 事件监听方法
    onScroll() {
        console.log("滚动条正在滚动");
    }
}


查看完整回答
反对 回复 2019-03-25
  • 2 回答
  • 0 关注
  • 4504 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信