关于前端:前端-Vue路由返回恢复页面状态的实现方案

5次阅读

共计 2762 个字符,预计需要花费 7 分钟才能阅读完成。

需要场景

首页搜寻内容,点击跳转至详情页,页面后退返回主页,保留搜寻后果。

计划:

路由参数;路由守卫

需要形容

在应用 vue 开发前端的时候遇到一个场景:在首页进行一些数据搜寻,点击搜寻后果进入详情页面,浏览详情页后返回主页。但这时候之前的搜寻记录和翻页就隐没了,用户体验不好。所以须要在返回后复原跳转前的页面参数状态。

当然如果条件容许,最简略的方法是点击搜寻后果应用新页面关上(例如百度那样)。

但以后需要是一个残缺的 vue 开发的我的项目,并不是关上站外地址,而且详情的内容也不多,应用新页面不太适合(性能较差而且容易制作巨量标签页)。

这里介绍两种比拟容易实现的解决方案:

  • 计划一:将搜寻参数存储在路由参数(route.query)中,加载页面时依据参数搜寻

长处:刷新不影响;实现简略
毛病:参数只能是根底类型、长度受限;门路看起来比拟难看;只对浏览器返回无效,手动跳转回首页不行

  • 计划二:应用路由守卫钩子,在来到页背后本地存储页面参数(vuex、Local Storage 等等)

长处:参数类型长度都比拟自在;门路看起来清新好看;对任意形式返回主页都无效
毛病:须要额定进行数据存储操作,如果应用 store 模式或 vuex 则刷新页面失效

计划一:路由参数

如果参数不多,并且不介意在门路前面有一大串参数(流下强迫症的泪水),能够间接把参数放在路由门路里

在点击搜寻后,应用 vue router 进行跳转并传参:


// 搜寻页面

search(param) {
  // 其余解决
  this.$router.push({
      name: "Index",
      query: {...this.queryParam},  // 将对象开展为键值
  });
},

这里要留神 query 传参和 params 传参的区别:前者的参数会以 ?k1=v1&k2=v2 的模式续在门路前面,能间接在地址栏中看到,因而不受页面跳转、刷新影响;后者只在第一次跳转到对应页面时起作用,再刷新跳转就没有了。

因而这里要应用 query 传参。如果把参数依照格局手动写在 path 中也是能够的,但易读性和扩展性显著更差,除非只有一两个简略参数,否则不举荐。

另外,因为这个参数是要放进门路里的,因而只能是根本类型的键值对,数组或对象不能很好地反对。

如果参数简略,能够将相应的对象开展当做参数(须要保障不同对象中没有重名键),但在跳转到的搜寻后果页面中读取时,就只能一一属性的获取。

// 搜寻后果页面

mounted() {
  // 辨别 $route 和 $router
  if (this.$route.query.type) {
    let type = this.$route.query.type;
    let keyword = this.$route.query.keyword;
    // ... 逐个获取各个参数
    // 进行搜寻操作
  } else {// 没有搜寻参数(因为我这搜寻后果和主页是同一个页面,所以有可能只是失常关上主页)}
},

计划二:本地存储参数

因为我这想存的参数是三个对象,开展成键值取着又太不不便,所以应用了这种计划。

因为我的项目里原本也应用了 vuex,就顺便存在了 vuex 外面,依据理论状况存在哪儿都行。

vuex 的毛病是一刷新就刷没了,对于搜寻后果这种优化体验性质的性能影响不大;如果有对应需要能够存在 local storage 外面。

因为我的需要中有很多中形式扭转参数,在扭转时存储参数太麻烦,而且容易出错或脱漏。因而这里抉择在路由跳转之前再对立存储所需参数。

Vue Router 提供了路由导航守卫系列 API 来实现相应性能,具体包含全局的前置 / 解析 / 后置守卫、路由配置守卫、组件守卫等形式。

所谓”守卫“,其实相当于渲染过程中的”钩子“,与相熟的 created, mounted 一样。

残缺的导航解析流程:
1. 导航被触发。
2. 在失活的组件里调用 beforeRouteLeave 守卫。
3. 调用全局的 beforeEach 守卫。
4. 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。
5. 在路由配置里调用 beforeEnter。
6. 解析异步路由组件。
7. 在被激活的组件里调用 beforeRouteEnter。
8. 调用全局的 beforeResolve 守卫 (2.5+)。
9. 导航被确认。
20. 调用全局的 afterEach 钩子。
11. 触发 DOM 更新。
12. 调用 beforeRouteEnter 守卫中传给 next 的回调函数,创立好的组件实例会作为回调函数的参数传入。

显然,这里应用 beforeRouteLeave 钩子就能很好地满足要求:


// 搜寻后果页面

beforeRouteLeave(to, from, next) {
  // vuex 存储操作
  this.$store.commit("updateRevert", {
    query: this.queryParam,
    page: this.pageParam,
    filter: this.filter,
  });
  next();  // 持续后续的导航解析过程},

加载页面时查看是否有保留的参数,有的话进行相应复原操作:


// 搜寻后果页面

mounted() {
  // 判断 vuex 中是否有保留的搜寻参数
  if (this.$store.state.revert) {
    const revert = this.$store.state.revert;
    this.queryParam = revert.query;
    this.pageParam = revert.page;  // 能够间接取出整个对象
    // 搜寻操作
  } else {// 没有搜寻参数(因为我这搜寻后果和主页是同一个页面,所以有可能只是失常关上主页)}
},

为了帮忙大家更好复习重点常识、更高效的筹备面试,整顿了《Vue 面试题总结》电子稿文件。

Vue 面试题

1.vue.js 的两个外围是什么?
2.vue 的双向绑定的原理是什么?
3.vue 生命周期钩子函数有哪些?
4. 请问 v-if 和 v-show 有什么区别?
5.vue 罕用的修饰符
6.nextTick
7. 什么是 vue 生命周期
8. 数据响应(数据劫持)
9.virtual dom 原理实现
10.Proxy 相比于 defineProperty 的劣势
11.vuex
12.vue 中 key 值的作用
13.Vue 组件中 data 为什么必须是函数?
14.v-for 与 v-if 的优先级
15. 说出至多 4 种 vue 当中的指令和它的用法
16.vue 中子组件调用父组件的办法
17.vue 中父组件调用子组件的办法
18.vue 页面级组件之间传值
19. 说说 vue 的动静组件。
20.keep-alive 内置组件的作用

结语

以上是两种保留页面状态形式的分享。其中很多抉择是与过后的理论需要相干的,因而不肯定在所有场景下都是最佳计划。对于你的具体需要,可能文中的计划可能存在有余,或者有更简略的办法,欢送评论区留言。

那么 Vue 面试题总结完整版的材料小伙伴点击这里能够获取。
正文完
 0