记录vue中使用removeEventListener和beforeDestory的一个坑

项目中有一个el-table,需要根据电脑分辨率和浏览器窗口大小自动变更height,于是想到在mounted中创建监听。

mounted() {
      window.addEventListener('resize', this.windowResize)
      //windowResize为调整el-table高度的方法
    },

但在调试过程中发现网页越来越卡,原来是离开该页面的时候没有销毁监听,每次加载页面就会多一次监听,加载次数多了就会变卡,需要在beforeDestory中销毁该监听

beforeDestroy() {
      window.removeEventListener('resize', this.windowResize)
    },

结果发现无法销毁,一开始以为是removeEventListener的问题,有说是因为匿名函数无法销毁,有说要在this.windowResize后面加", true",但都没有效果。后来仔细查了vue生命周期,怀疑运行的时候是不是根本没进到beforeDestory里。然后在控制台里打断点,果然没有运行这段代码。
网上查到是因为<keep-alive>标签导致beforeDestory没有被触发

    <div class="app-wrapper" >
        <el-container>
            <el-aside width="60px" class="hidden-sm-and-down">
                <sidebar></sidebar>
            </el-aside>
            <el-container style="height: 100vh;width:1000px;max-height: 100vh">
                <el-header height="40px">
                    <navBar v-on:listenToChildEvent="showMsgFromChild"></navBar>
                </el-header>
                <el-main>
                    <transition name="fade" mode="out-in">
<!--                        <keep-alive>-->
                            <router-view :key="key"></router-view>
<!--                        </keep-alive>-->
                    </transition>
                </el-main>
            </el-container>
        </el-container>
    </div>

把<keep-alive>去掉就可以了
由于刚开始做项目,基础还不是很好,所以记录下来

Vue.js 是一个流行的前端框架,它提供了一些生命周期钩子函数,使得我们可以在组件不同的生命周期执行自定义行为。其,beforeDestroy 钩子函数是在组件即将销毁之前被调用的。在实际开发,我们可能会遇到 beforeDestroy 钩子函数不触发的问题,这种问题可能由以下原因引起: 1.代码未正确实现 在组件内部,beforeDestroy 钩子函数应该写成: beforeDestroy () { // do something before destroying the component } 如果 beforeDestroy 钩子函数没有被正确实现,它就无法被调用。因此,我们应该仔细检查代码,确保正确使用了这个钩子函数。 2.组件没有被正确销毁 如果组件没有被正确销毁,beforeDestroy 钩子函数就会无法被调用。这可能是由于组件依赖于引用计数而不是垃圾回收机制,而在某些情况下,组件可能会被保留在内存而没有被正确销毁。 为了解决这个问题,我们可以在销毁组件时手动调用 $destroy 方法: this.$destroy() 这将触发组件的 beforeDestroy 钩子函数,并将组件完全从内存清除。 3.使用异步代码 在某些情况下,如果我们在 beforeDestroy 钩子函数使用了异步代码,它可能会导致钩子函数不被调用。这是由于 Vue 在异步代码执行之前已经销毁了组件。 为了解决这个问题,我们可以将异步代码放在 Vue.nextTick 回调函数执行,以确保组件在销毁之前执行完所有异步操作: beforeDestroy () { Vue.nextTick(() => { // execute async code here }) } 总之,为了确保 beforeDestroy 钩子函数被正确触发,我们应该仔细检查代码,确保正确实现了钩子函数,并手动调用 $destroy 方法,并避免在钩子函数使用异步代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值