路由 A 中的自定义 component 里,有个定时器,跳转到另个路由里,如何关闭定时器?

2019-10-10 18:10:49 +08:00
 jiushengyuan

问题如标题。

我搜索,大部分资料是 路由 A 中有个定时器,不是在 component 里。我现在的问题是 如何获取到 component 中 timer = setTimeout() 的这个 timer。

只找到 点击这里,是把 timer 写成全局的了,所以方便访问。不知道这样好不好,有其他方法吗?

示例代码:

Vue.component('v-osd', {
    template: 'xxx',
    data: function() {
        var myData = {};
        function refresh() {
            get(
                'get_client_osd_list', {
                    id: 1,
                },
                response => {
                    refreshTimer = setTimeout(function() {
                        refresh();
                    }, 500);
                }
            );

        }
        refresh();
        return myData;
    },
});

var routeA = {
    template: 'yyy',
    data: function() {
        return {};
    },
    
    beforeRouteLeave(to, from, next) {
        // 如何获取到 组件里面的 timer??
        clearInterval(refreshTimer);
        next();
    },
};
2854 次点击
所在节点    Vue.js
4 条回复
wiluxy
2019-10-10 19:44:43 +08:00
跳转到另外一个路由的话,如果当前路由没有倍<keep-active>保留的话,component 应该就跟着销毁了,调用组件销毁前生命周期清除定时器,或者用 vue-router 的路由跳转钩子函数。。。跳转前判断当前路由是不是路由 A,是的话就清除定时器
15651980765
2019-10-11 09:52:16 +08:00
这个组件没有 keepalive 缓存的话,beforeDestroy 的时候清除这个定时器;
这个组件有 keepalive 缓存的话,deactivated 的时候清除这个定时器。
个人观点,如有错误请指正。
楼上通过路由跳转钩子函数判断当前路由的方法好像也可以,但是定时器应该得放在全局变量里。
jiushengyuan
2019-10-11 10:23:49 +08:00
感谢 @wiluxy @15651980765 提供的,
现在在 component beforeDestroy 中,引用 refreshTimer,就不用设成全局变量了。

有个新问题,路由是没有 keepalive 的,如果我不清除定时器,在跳转到新路由时,refreshOsd 还是会不断执行,也可以访问到其中的 self 是个 compoenent。
可是 component 不是已经被销毁了吗?
jiushengyuan
2019-10-12 17:42:00 +08:00
是给的代码示例太长,大家都没耐心看了么。其实那个只是方便模拟贴出来,问题不复杂的。

新问题:路由是没有 keepalive 的,如果我不清除定时器,在跳转到新路由时,refreshOsd 还是会不断执行,也可以访问到其中的 self 是个 compoenent。
可是 component 不是已经被销毁了吗?

有没有大佬帮忙看看呀

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/607977

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX