使用VUE开发单页项目时遇到这样的问题,mounted中使用setInterval()定时向服务器获取数据,后来跳转页面后,发现还在不停的获取数据。我以为是因为我路由用的push导致的,改成replace也是这样,后来就在博客园找到答案了,如下:

http://www.cnblogs.com/zzbp/p/5834110.html

问题:(javascript)使用Vuejs + Vue-router 开发单页面,如何使得切换页面时能销毁原组件?
描述:

我有一个单页面应用,有页面A和页面B,二者是同级组件,关系是这样的:

 

router.map({
'/a': {
component: A
}, '/b': {
component: B
},`

例如,第一次打开时,显示页面 A,页面 A 有一个setInterval事件,每隔一秒钟会向后台发送一个Ajax请求。这时我点击页面 A 上的跳转按钮,跳到页面 B,通过观察网络连接,发现页面 A 上的Ajax请求仍然在继续。

请问应当进行什么样的设置,才能使得页面切换时,原来的组件就被销毁?

这是个非常严重的问题,同级组件绑定的事件,还会在另一个组件里继续监听。所以我猜想会有简单的配置方法,但我看遍了 Vue 的文档和 Vue-router 的文档,也未发现相关配置。

解决方案1:

1、setInterval事件和组件的生命周期没有直接关系。
2、setInterval会返回一个ID 值。setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。

解决方案2:

router切换时,原来的组件确实已经销毁了,你可以看到ready生命周期函数是每次都触发了的。你这里的问题不在于组件是否销毁,因为setInterval事件本身和组件没有关系。

setInterval相当于该组件申请的一种资源,在使用该组件时获取,在离开该组件时释放。这个过程只能是你手动进行的。所以你应该在离开该组件时,比如route的deactivate或者beforeDestory生命周期函数里手动clearInterval。

其实很多框架里都是这样,比如桌面程序中某个窗口初始化时需要打开数据库连接(我们也可以视为一种资源),当窗口关闭时,程序本身并不知道“打开数据库连接”的反向操作是什么。所以我们需要在窗口销毁的回调方法里手动去释放这个资源,去写断开连接的代码。

解决方案3:

http://stackoverflow.com/questions/35104770/how-to-destroy-a-component-when-building-spa-with-vue-js-and-vue-router

http://vuejs.github.io/vue-router/zh-cn/pipeline/deactivate.html

最后我根据解决方案1解决了,贴下我的代码:

created () {
this.intervalid1 = setInterval(() => {
var sid = this.stationid
this.$store.dispatch('fetchStationDetail', sid)
}, 20000)
this.intervalid2 = setInterval(() => {
var sid = this.stationid
var thedate = new Date(this.seldate)
var nowdate = new Date()
if (thedate.toLocaleDateString() === nowdate.toLocaleDateString()) {
var theyear = thedate.getFullYear()
var themonth = thedate.getMonth() + 1
this.$store.dispatch('fetchStationPowers', {
id: sid,
yearint: theyear,
monthint: themonth
})
}
}, 60000)
},
beforeDestroy () {
clearInterval(this.intervalid1)
clearInterval(this.intervalid2)
},

vue单页应用中,使用setInterval()定时向服务器获取数据,后来跳转页面后,发现还在不停的获取数据。的更多相关文章

  1. 如何在vue单页应用中使用百度地图

    作为一名开发人员,每次接到开发任务,我们首先应该先分析需求,然后再思考技术方案和解决方案.三思而后行,这是一个好的习惯. 需求:本项目是采用vue组件化开发的单页应用项目,现需要在项目中引入百度的地图 ...

  2. vue 单页应用中微信支付的坑

    vue 单页应用中微信支付的坑 标签(空格分隔): 微信 支付 坑 vue 场景 在微信H5页面(使用 vue-router2 控制路由的 vue2 单页应用项目)中使用微信 jssdk 进行微信支付 ...

  3. vue单页应用中 返回列表记住上次滚动位置、keep-alive缓存之后更新列表数据 那点事

    实践场景需求 产品列表中,滚动到一定位置的时候,点击查看产品信息,后退之后,需要回到原先的滚动位置,这是常见的需求 所有页面均在router-view中,暂时使用了keep-alive来缓存所有页面, ...

  4. vue单页应用中根据不同城市不同业务添加百度统计代码

    问题描述: 我们知道一般的百度统计代码是添加在html的head里的:但是,因为目前项目是用vue开发的单页应用,所以在路由跳转之间不会刷新页面, 统计代码如果放在项目里的index.heml的hea ...

  5. Vue 基于node npm & vue-cli & element UI创建vue单页应用

    基于node npm & vue-cli & element UI创建vue单页应用 开发环境   Win 10   node-v10.15.3-x64.msi 下载地址: https ...

  6. vue单页应用前进刷新后退不刷新方案探讨

    引言 前端webapp应用为了追求类似于native模式的细致体验,总是在不断的在向native的体验靠拢:比如本文即将要说到的功能,native由于是多页应用,新页面可以启用一个的新的webview ...

  7. 解决vue单页路由跳转后scrollTop的问题

    作为vue的初级使用者,在开发过程中遇到的坑太多了.在看页面的时候发现了页面滚动的问题,当一个页面滚动了,点击页面上的路由调到下一个页面时,跳转后的页面也是滚动的,滚动条并不是在页面的顶部 在我们写路 ...

  8. 基于vue单页应用的例子

    代码地址如下:http://www.demodashi.com/demo/13374.html 目录结构 src目录 主要的代码目录 components 存放项目组件 router 路由文件 sto ...

  9. PageSlider中CSS3动画在除首屏之外先加载页面后执行动画的问题

    PageSlider中CSS3动画在除首屏之外先加载页面后执行动画的问题,PageSlider中加入CSS3动画的话,默认只有首屏是从无到有执行动画,其他屏都是显示下页面再执行动画 这就造成其他屏的动 ...

随机推荐

  1. Ubuntu 快速安装配置Odoo 12

    Odoo 12预计将于今年10月正式发布,这是一次大版本更新,带来了一些不错的新特性,如 文件管理系统(DMS) 用户表单中新增字段(Internal user, Portal, Public) HR ...

  2. We'll be fine.

    可怜的人心中都有一种信念,那就是 明天会更好. Everything will be fine. 我拥见风来,嗅见花开,是避不掉的厉寒,是止不住的徘徊.

  3. WhaleCTF之web-本地登录

    WhaleCTF之web-本地登录 前往题目 呵呵,基然对ip限制,没事,掏出burp抓包 改包 添加XFF头部 X-Forwarded-For: 127.0.0.1 发一下 不是admin,没有用户 ...

  4. 阿里巴巴毕玄解密AIOps:一文读懂阿里巴巴运维体系的前世今生

    [编者按]林昊(毕玄),阿里巴巴研发效能事业部负责人.2007年加入阿里,10年间打造了阿里目前使用最为广泛的核心中间件之一的服务框架:建设了阿里的HBase团队,发展到今天HBase已经是阿里最重要 ...

  5. ssh连接Ubuntu之access denied

    解决方法是: 修改/etc/ssh/ssh_config文件, #PermitRootLogin prohibit-password改为PermitRootLogin yes 然后 PasswordA ...

  6. vue使用远程在线更新代码

    一.main.js import Vue from 'vue' import App from './App' import router from './router' import Vuex fr ...

  7. [转]WPF中Binding的技巧

    在WPF应用的开发过程中Binding是一个非常重要的部分. 在实际开发过程中Binding的不同种写法达到的效果相同但事实是存在很大区别的. 这里将实际中碰到过的问题做下汇总记录和理解. 1. so ...

  8. HZOI20190803 B题

    题目:https://www.cnblogs.com/Juve/articles/11295333.html 话说这题方法挺多 40分:暴力 65:莫队,你会T得飞起 我考场上没打出带修莫队,没有修改 ...

  9. python验证码识别PIL+pytesseract

    1.需要模块安装 在python安装目录scripts即: 执行pip install pillow 下载tesseract-ocr-setup-4.00.00dev.exe 安装,我的目录在C盘默认 ...

  10. const 有什么用途

    可以定义const 常量:const可以修饰函数的参数.返回值,甚至函数的定义体.被const 修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性