`

VUE 组件在路由确定并且保持缓存的情况下如何实现关闭定时器

    博客分类:
  • VUE
 
阅读更多

最近在用echar做一个前端柱状图如图

 

其中echar被写成了纯组件

 

<div class="chart-wrapper">
  <bar-chart :close-flag="closeFlag" :sort-field="queryParams.sortField"  :sort-flag="queryParams.sortFlag" :week = "isoWeekData.weeks"  :team="'TP'" :equipment = "queryParams.equipment"/>
</div>

组件bar-chart的数据获取核心方法为getInfo,现在想实现3秒定时获取信息。

好,我们将面对以下几个问题:

 

1.我们的核心路由设置已经全局cache,除了手动reload(F5外)无法刷新当前页面,普通的JSload 放弃(体验太差)

 <keep-alive>

  <router-view :key="key" />
</keep-alive>

2. 因为全局的keep-alive,固页面的beforeDestory, 以及 destory都是无效方法,页面是不会被摧毁的

3. 第二点的解决方法很简单,在组件的调用页面我们可以很轻松的实现路由进出来实现desrory等方法的相同实现,类似这样

beforeRouteEnter(to,from,next){
  console.log("enter")
  next(vm => {
    vm.timer = setInterval(function(){
      vm.getData()
    } , 3000);
  })
},
beforeRouteLeave(to, from, next) {
  console.log("leave")
  clearInterval(this.timer);
  this.timer = '';
  next()
},

4.但是,在组件内部,不仅destory相关方法无效,就连路由判定都失效(因为VUE的组件加载机制),这样问题就来了:我们想象的组件是一套完成的构架,包括数据源获取都一定想写在组件内部,那么怎么才能实现呢?

 

OK,解决方法是组件属性监听:

1.在组件内部添加字段:

 

props:

closeFlag:{
  type: Boolean,
  default: false
}

然后watch:

 closeFlag: {

  handler(newVal, oldVal) {
    console.log("监控了")
    if(newVal){
      console.log("Close Timer")
      clearInterval(this.timer);
      this.timer = null;
    }else{
      console.log("Check Timer")
      if(this.timer != null) return;
      console.log("Setup Timer")
      let that = this;
      this.timer = setInterval(function(){
        that.getInfo()
      } , 3000);
    }
  },
  deep: true //对象内部属性的监听,关键。
},

让我们回到调用组件的页面

 

beforeRouteLeave(to, from, next) {
  console.log("出去了UI")
  this.closeFlag = true;
  next()
},
beforeRouteEnter(to,from,next){
  console.log("进来了UI")
  next(vm => {
    vm.closeFlag  = false;
  })
},

 

最后在调用组件的界面初始化监听值:

closeFlag:null,

一定要为null,而不为false(让全局第一次进入可以正确初始化timer)

 

 

让我们看看效果:

 

breadcrumb.vue?7ced:29 /operator/home/processcontrol/pareto

BarChart.vue?f42a:156 监控了

BarChart.vue?f42a:162 Check Timer

BarChart.vue?f42a:164 Setup Timer

7BarChart.vue?f42a:182 获取数据!

index.vue?6ced:106 出去了UI

breadcrumb.vue?7ced:29 /operator/home/processcontrol

BarChart.vue?f42a:156 监控了

BarChart.vue?f42a:158 Close Timer

index.vue?6ced:111 进来了UI

breadcrumb.vue?7ced:29 /operator/home/processcontrol/pareto

BarChart.vue?f42a:156 监控了

BarChart.vue?f42a:162 Check Timer

BarChart.vue?f42a:164 Setup Timer

220BarChart.vue?f42a:182 获取数据

 

 

完美解决!!

 (PS 现在为什么无法保存图片了?)

 

0
1
分享到:
评论

相关推荐

    解决vue组件销毁之后计时器继续执行的问题

    在这种情况下,可以添加一个检查来确定组件是否已经被销毁,然后决定是否执行回调。示例代码如下: ```javascript window.setTimeout(function() { if (this && !this._isDestroyed) { // 如果组件未被销毁,则...

    vue setInterval 定时器失效的解决方式

    在Vue.js应用中,`setInterval`定时器的使用可能会遇到一些问题,特别是在涉及到组件的创建、销毁以及路由切换时。这是因为Vue的组件是有生命周期的,而`setInterval`会在后台持续运行,即使组件已经被销毁或者用户...

    优化了keepAlive的缓存机制可以像APP那样前进刷新返回销毁

    在Vue.js应用中,`keep-alive`组件用于缓存组件状态,以便在导航时保持其状态,提高用户体验。在标题和描述中提到的优化,是关于改进`keep-alive`的缓存策略,使其更接近原生APP的页面管理方式,即前进刷新内容,...

    关于Vue.js2.0生命周期的研究与理解1

    在示例代码中,我们看到一个包含子组件`my-c`的Vue实例,子组件`child`定义了`deactivated`和`activated`两个钩子,这两个是Vue的路由管理器Vue Router特有的,用于组件的懒加载和缓存。`deactivated`在组件被切换...

    基于Vue实现tab栏切换内容不断实时刷新数据功能

    在开发Web应用时,我们经常遇到需要实现动态切换并实时更新数据的需求,特别是在有多个Tab栏的场景下。Vue.js作为一个轻量级的前端框架,提供了强大的数据绑定和组件化能力,非常适合处理这类问题。本篇文章将详细...

    深入理解Vue 的钩子函数

    Vue 的生命周期中,钩子函数扮演着至关重要的角色,它们在组件的不同阶段执行特定任务,帮助开发者实现复杂的逻辑。Vue 提供了多个生命周期钩子,如 `created`、`mounted` 等,但理解它们之间的区别和应用场景至关...

    vue单页应用的内存泄露定位和修复问题小结

    Vue 单页应用的内存泄露定位与修复是一个关键的话题,特别是在复杂的前端项目中。内存泄漏可能导致性能下降,甚至导致应用程序崩溃。以下是对这个问题的详细解释和解决方案。 首先,理解内存泄漏的概念至关重要。...

    2020前端最新面试题(vue篇)

    - 在组件销毁前执行,适合清理回调函数、定时器,释放不必要的资源。 4. **同级组件间通信**: - 通过父组件作为中介传递数据。 - 使用事件总线(Event Bus):创建一个Vue实例作为事件中心,组件之间通过`$emit...

    javascript经典效果示例

    JavaScript是一种广泛应用于网页和网络应用的编程语言,尤其在实现网页动态效果方面有着不可或缺的作用。"javascript经典效果示例"这个主题聚焦于展示JavaScript在实际中的应用,帮助开发者提升网站用户体验,让页面...

    javascript效果javascript效果

    AJAX(Asynchronous JavaScript and XML)允许我们在不刷新整个页面的情况下与服务器交换数据并局部更新页面。通过创建XMLHttpRequest对象,发送GET或POST请求,处理服务器返回的数据,我们可以实现无刷新加载、分页...

    前端面试大全,自己整理

    - **路由**:Vue Router的安装配置、动态路由匹配、导航守卫。 - **状态管理**:Vuex的store、state、mutations、actions、getters的使用。 - **Vue CLI**:脚手架工具的使用,项目构建与配置。 3. **HTML** - ...

    javascript前台开发

    JavaScript前端开发是现代Web应用程序开发的核心技术之一,它赋予了网页动态交互的能力,使得用户可以在不刷新整个页面的情况下与网站进行实时互动。JavaScript的主要特点包括跨平台性、轻量级和解释执行,使得它...

    272个超酷经典推荐JavaScript代码

    14. **框架和库**:如React、Vue、Angular等,它们提供了更高级别的抽象,简化了开发流程,同时也涵盖了状态管理、路由、组件化等方面的知识。 15. **Web API**:如WebSocket、Fetch API、Web Storage等,它们扩展...

    各种JS强化

    2. Vue:了解Vue的数据绑定、指令系统、组件和单文件组件的编写。 3. Angular:探索Angular的依赖注入、双向数据绑定、路由和模块化。 六、错误处理与调试技巧 1. 错误处理:try...catch语句,自定义Error类,以及...

    RXJS实战 pdf

    7. **实战案例**:书中应该包含实际项目中的应用场景,比如在 Angular、Vue 或 React 框架中使用 RxJS 实现组件通信、API 调用、路由导航等。 8. **性能优化**:讨论如何通过背压策略、缓存和订阅管理来优化 RxJS ...

    javascript教程(超好用)

    JavaScript在前端开发中的应用催生了一系列框架和库,如React、Vue.js、Angular等,它们提供了组件化开发、状态管理、路由等高级功能,极大地提高了开发效率和代码质量。 8. **Node.js** Node.js是一个基于Chrome...

    javascrip上百技术总集(精品)

    11. **前端框架**:如React、Vue、Angular等,理解其核心原理和组件化开发模式,掌握状态管理(Redux、Vuex)和路由管理(React Router、Vue Router)。 12. **JavaScript设计模式**:学习单例、工厂、观察者、装饰...

    前端开发-笔试面试题大全md.zip

    - 动画和定时器:`setTimeout`,`setInterval`,CSS动画与JavaScript动画的实现。 5. BOM(Browser Object Model): - 浏览器对象,如`window`,`document`,`navigator`。 - 浏览器的URL管理,如`location`...

Global site tag (gtag.js) - Google Analytics