Vue生命周期activated之返回上一页不重新请求数据操作


Posted in Javascript onJuly 26, 2020

activated: 英文原意:使活动、触发

在Vue的生命周期函数中,这个好像用的不是特别多?(也许只是在我的工作中这个用的不多,或者说叫几乎不用这个)

一、需求

前不久在项目中有这样一个需求:

在订单页面的地址信息栏,默认通过接口填充了一个已经设置过的一个的默认地址,现在要跳转去地址列表重新选择一个地址并回填到订单页面的地址信息位置

二、尝试

常规操作:

我们通常会将通过接口请求数据的方法放在==created== 或者 ==mounted==这两个生命周期中的一个里面调用。

但是我们知道,不管是我们刚进入这个页面还是从其他页面返回这个页面,这些生命周期都会走一遍。

问题:

所以,即使你跳转到下级页面选好你所需的数据返回上一页时,你所回填的数据又被从接口请求回来的数据给覆盖了。。。,这并不是我们想要的效果!!!

三、使用keep-alive

不想让页面加载数据???当然可以,这时候==Keep-alive==登场了

vue2.0提供了一个keep-alive组件用来缓存组件,避免多次加载相应的组件,减少性能消耗

1、缓存所有页面

如果你想缓存所有的页面,只需要修改下app.vue中的代码即可

// app.vue
 
  <template>
   <div id="app">
    <keep-alive >
     <router-view></router-view>
    </keep-alive>
    <tabBar/>
   </div>
  </template>

2、缓存部分页面

如果你想缓存部分页面,有两种方式:

(1)使用router.meta属性

app.vue

// app.vue
 
  <template>
   <div id="app">
    <keep-alive >
     <router-view v-if="$route.meta.keepAlive"></router-view>
    </keep-alive>
    <router-view v-if="!$route.meta.keepAlive"></router-view>
    <tabBar/>
   </div>
  </template>

router.js

{
   path: '/usermanage',
   name: 'usermanage',
   meta: {
    keepAlive: true, //该字段表示该页面需要缓存
   },
   component: resolve => require(['@/views/userManage/userManage'], resolve) // 路由懒加载
  },

(2)使用vue-router 2.0的新特性

2.0提供了include/exclude两个属性 可以针对性缓存相应的组件

app.vue

<keep-alive include="a,b">
  <router-view></router-view>
</keep-alive>

==注意==:上面代码中的a,b是需要缓存的组件的name属性值,不是路由的name值

使用keep-alive结论

当你第一进入需要缓存的页面后,页面数据被缓存下来,但是当你再次进入时,你会发现,页面的数据还是之前的数据。。。。这也不是我们想要的效果!!!!

四、activated配合keep-alive

首先,我们需要使用router.meta属性,修改需要缓存的组件路由如下

// keepAlive和isback这两个很重要!
{
   path: '/usermanage',
   name: 'usermanage',
   meta: {
    keepAlive: true, //该字段表示该页面需要缓存
    isBack: false, //用于判断上一个页面是哪个
    title: '人员管理'
   },
   component: resolve => require(['@/views/userManage/userManage'], resolve) // 路由懒加载
  },

然后修改需要缓存的组件中的代码(只放重点部分):

<script>
 export default {
  name: 'currentName',
  data() {
   return {
  
    isFirstEnter: false, //
   }
  },
  beforeRouteEnter(to, from, next) {
   if (from.name == 'nextName') { // 这个name是下一级页面的路由name
    to.meta.isBack = true; // 设置为true说明你是返回到这个页面,而不是通过跳转从其他页面进入到这个页面
   }
   next()
  },
  mounted() {
   
  },
  activated() {
   if (!this.$route.meta.isBack || this.isFirstEnter) {
    this.initData() // 这里许要初始化dada()中的数据
    this.getDataFn() // 这里发起数据请求,(之前是放在created或者mounted中,现在只需要放在这里就好了,不需要再在created或者mounted中请求!!)
   }
   this.$route.meta.isBack = false //请求完后进行初始化
   this.isFirstEnter = false;//请求完后进行初始化
  },
 }
</script>

大功告成

这样就实现了:从其他页面跳转到这个页面时会请求数据,当从下级页面返回这个页面时就不会重新请求数据

以上这篇Vue生命周期activated之返回上一页不重新请求数据操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
基于jQuery的图片剪切插件
Aug 03 Javascript
仿jQuery的siblings效果的js代码
Aug 09 Javascript
js jquery验证银行卡号信息正则学习
Jan 21 Javascript
利用毫秒减值计算时长的js代码
Sep 22 Javascript
JavaScript中创建对象和继承示例解读
Feb 12 Javascript
jquery复选框checkbox实现删除前判断
Apr 20 Javascript
js判断浏览器是否支持html5
Aug 17 Javascript
移动端使用localStorage缓存Js和css文的方法(web开发)
Sep 20 Javascript
获取jqGrid中选择的行的数据
Nov 30 Javascript
jQuery联动日历的实例解析
Dec 02 Javascript
jQuery HTML css()方法与css类实例详解
May 20 jQuery
javascript代码实现简易计算器
Jan 25 Javascript
使用React-Router实现前端路由鉴权的示例代码
Jul 26 #Javascript
vue项目使用$router.go(-1)返回时刷新原来的界面操作
Jul 26 #Javascript
vue 页面回退mounted函数不执行的解决方案
Jul 26 #Javascript
vuex分模块后,实现获取state的值
Jul 26 #Javascript
何时/使用 Vue3 render 函数的教程详解
Jul 25 #Javascript
全面解析JavaScript Module模式
Jul 24 #Javascript
vuex 多模块时 模块内部的mutation和action的调用方式
Jul 24 #Javascript
You might like
一组PHP加密解密函数分享
2014/06/05 PHP
PHP中的output_buffering详细介绍
2014/09/27 PHP
php不使用copy()函数复制文件的方法
2015/03/13 PHP
wordpress安装过程中遇到中文乱码的处理方法
2015/04/21 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
PHP按一定比例压缩图片的方法
2018/10/12 PHP
Javascript 中 null、NaN和undefined的区别总结
2013/04/10 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
2014/12/29 Javascript
jQuery子属性过滤选择器用法分析
2015/02/10 Javascript
原生JS封装Ajax插件(同域、jsonp跨域)
2016/05/03 Javascript
BootStrap使用popover插件实现鼠标经过显示并保持显示框
2016/06/23 Javascript
js事件源window.event.srcElement兼容性写法(详解)
2016/11/25 Javascript
vue组件jsx语法的具体使用
2018/05/21 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
2018/05/29 Javascript
详解nuxt sass全局变量(公共scss解决方案)
2018/06/27 Javascript
vue 实现边输入边搜索功能的实例讲解
2018/09/16 Javascript
Anaconda下配置python+opencv+contribx的实例讲解
2018/08/06 Python
python利用插值法对折线进行平滑曲线处理
2018/12/25 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
Python Django框架url反向解析实现动态生成对应的url链接示例
2019/10/18 Python
Python爬虫使用代理IP的实现
2019/10/27 Python
在OpenCV里实现条码区域识别的方法示例
2019/12/04 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
Python3.7在anaconda里面使用IDLE编译器的步骤详解
2020/04/29 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
HTML5通过调用canvas对象的getContext()方法来获取绘图环境
2014/06/23 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
澳大利亚宠物食品和药物在线:Jumbo Pets
2018/03/24 全球购物
美国翻新电子产品商店:The Store
2019/10/08 全球购物
工商管理应届生求职信
2013/10/07 职场文书
内科护士实习自我鉴定
2013/10/17 职场文书
写好自荐信的技巧
2013/11/08 职场文书
园艺师求职信
2014/04/27 职场文书
医院搬迁方案
2014/06/14 职场文书
工作总结与自我评价
2014/09/18 职场文书
我们的节日端午节活动总结
2015/02/11 职场文书