vue的路由模式有几种(Vue 路由返回恢复页面状态的操作方法)
vue的路由模式有几种
Vue 路由返回恢复页面状态的操作方法路由参数、路由导航守卫:页面后退返回时,保留搜索结果
需求描述需求场景:首页搜索内容,点击跳转至详情页,页面后退返回主页,保留搜索结果。
方案:路由参数;路由守卫
在使用 Vue 开发前端的时候遇到一个场景:在首页进行一些数据搜索,点击搜索结果进入详情页面,浏览详情页后返回主页。但这时候之前的搜索记录和翻页就消失了,用户体验不好。所以需要在返回后恢复跳转前的页面参数状态。
当然如果条件允许,最简单的办法是点击搜索结果使用新页面打开(例如百度那样)。但当前需求是一个完整的Vue开发的项目,并不是打开站外地址,而且详情的内容也不多,使用新页面不太合适(性能较差而且容易制造巨量标签页)。
这里介绍两种比较容易实现的解决方案:
- 方案一:将搜索参数存储在路由参数(route.query)中,加载页面时根据参数搜索
优点:刷新不影响;实现简单
缺点:参数只能是基础类型、长度受限;路径看起来比较难看;只对浏览器返回有效,手动跳转回首页不行
- 方案二:使用路由守卫钩子,在离开页面前本地存储页面参数(vuex、Local Storage 等等)
优点:参数类型长度都比较自由;路径看起来清爽美观;对任意方式返回主页都有效
缺点:需要额外进行数据存储操作,如果使用store模式或vuex则刷新页面失效
方案一:路由参数如果参数不多,并且不介意在路径后面有一大串参数(流下强迫症的泪水),可以直接把参数放在路由路径里(比如百度就是这样:baidu.com/s?wd=abc&rsv_spt=1&rsv_iqid=0x8a76279a000e2979&...
,可以看到,确实是很长的一大串)。
在点击搜索后,使用 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 一样。
完整的导航解析流程:
- 导航被触发。
- 在失活的组件里调用
beforeRouteLeave
守卫。 - 调用全局的
beforeEach
守卫。 - 在重用的组件里调用
beforeRouteUpdate
守卫 (2.2+)。 - 在路由配置里调用
beforeEnter
。 - 解析异步路由组件。
- 在被激活的组件里调用
beforeRouteEnter
。 - 调用全局的
beforeResolve
守卫 (2.5+)。 - 导航被确认。
- 调用全局的
afterEach
钩子。 - 触发 DOM 更新。
- 调用
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 路由页面状态内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
- vue图片组件使用方法(Vue图片裁剪组件实例代码)
- vue身份验证(详解vue身份认证管理和租户管理)
- vue 富文本图片上传(vue.js云存储实现图片上传功能)
- vue移动端图片放大效果实现(vue实现图片切换效果)
- vue项目有element插件(Vue Element前端应用开发之前端API接口的封装)
- vue跨域代理怎么写(解决vue $http的get和post请求跨域问题)
- vue3.0路线图(Vue3.0 自己实现放大镜效果案例讲解)
- vue项目做过哪些打包优化(Vue项目优化的一些实战策略)
- vue3 响应式的实现过程(Vue3.x使用mitt.js进行组件通信)
- vue用手动上传图片(vue上传图片文件的多种实现方法)
- vue设置属性没响应(Vue.$set 失效的坑 问题发现及解决方案)
- vue怎么操作表格(如何在在Vue3中使用markdown 编辑器组件)
- vue实现一个炫酷的日历组件(vue利用Moment插件格式化时间的实例代码)
- vue组件keep-alive的原理是什么(如何理解Vue简单状态管理之store模式)
- vue中router的具体用法(vue-router中hash模式与history模式的区别)
- vue监控对象变化(Vue之监听方法案例详解)
- 少儿口才表达影响未来一生,50首经典绕口令和孩子玩出聪明大脑(少儿口才表达影响未来一生)
- 玩网游居然让人更友善 很难以让人置信(玩网游居然让人更友善)
- 学好汉语拼音,从娃娃绕口令抓起,平时还是要多练 收藏好(从娃娃绕口令抓起)
- 仙女们的私藏鲜法大PK 鲜香切块牛肉(仙女们的私藏鲜法大PK)
- 天热没胃口 这道菜开胃又下饭,2个小技巧新手一学就会(这道菜开胃又下饭)
- 指天椒紫苏爆炒牛肉(指天椒紫苏爆炒牛肉)
热门推荐
- idea配置mysql最大连接数(IDEA连接不上MySQL端口号占用的解决)
- SQL Server 批量导入数据的方法
- dedecms滚动代码(dedecms使用sql语句调用文章静态链接地址的方法)
- docker启动sqlserver(用docker运行postgreSQL的方法步骤)
- sqlserver数字格式化五位小数(详细分析sqlserver中的小数类型float和decimal)
- sql server设置自增(sql server建表时设置ID字段自增的简单方法)
- 常见的web服务器有哪些(web服务器是什么?web服务器怎么设置)
- 云服务器有必要备案吗(免备案云服务器多少钱?)
- php连接数据库拒绝使用域名(访问php时提示内存位置访问无效的解决办法和思路分析)
- 宝塔面板怎么找密码(宝塔面板忘记密码怎么找回?)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9