文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Vue 路由返回恢复页面状态的操作方式

2023-06-20 15:29

关注

这篇文章主要介绍“Vue 路由返回恢复页面状态的操作方式”,在日常操作中,相信很多人在Vue 路由返回恢复页面状态的操作方式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Vue 路由返回恢复页面状态的操作方式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

路由参数、路由导航守卫:页面后退返回时,保留搜索结果

需求场景:首页搜索内容,点击跳转至详情页,页面后退返回主页,保留搜索结果。

方案:路由参数;路由守卫

需求描述

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

当然如果条件允许,最简单的办法是点击搜索结果使用新页面打开(例如百度那样)。但当前需求是一个完整的Vue开发的项目,并不是打开站外地址,而且详情的内容也不多,使用新页面不太合适(性能较差而且容易制造巨量标签页)。

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

优点:刷新不影响;实现简单

缺点:参数只能是基础类型、长度受限;路径看起来比较难看;只对浏览器返回有效,手动跳转回首页不行

优点:参数类型长度都比较自由;路径看起来清爽美观;对任意方式返回主页都有效

缺点:需要额外进行数据存储操作,如果使用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 一样。

完整的导航解析流程:

  1. 导航被触发。

  2. 在失活的组件里调用 beforeRouteLeave 守卫。

  3. 调用全局的 beforeEach 守卫。

  4. 在重用的组件里调用 beforeRouteUpdate 守卫 (2.2+)。

  5. 在路由配置里调用 beforeEnter

  6. 解析异步路由组件。

  7. 在被激活的组件里调用 beforeRouteEnter

  8. 调用全局的 beforeResolve 守卫 (2.5+)。

  9. 导航被确认。

  10. 调用全局的 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 路由返回恢复页面状态的操作方式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯