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

这里要注意 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, fr 《大厂前端面试题解析+Web核心总结学习笔记+企业项目实战源码+最新高清讲解视频》无偿开源 徽信搜索公众号【编程进阶路】 om, 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 的优势

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值