详解使用Vue Router导航钩子与Vuex来实现后退状态保存

发布时间 - 2026-01-11 03:12:18    点击率:

不好意思,标题比较啰嗦,因为这次的流水账确实属于一个比较细节的小东西,下面详细讲:

1需求

最近在使用electron-vue 开发一个跨平台的桌面端软件,刚上手写了几个页面,遇到一个问题:桌面端软件通常会有导航需求,类似下图

导航按钮

点击返回按钮,返回上一页,并且显示上页内容。其实不止App,即使普通的网页中也会有此类需求,尤其是使用vue写SPA时。

项目中的导航几乎都是采用router.push({name: 'xxx', params: {xxx:123...}})这种方式。这种方式导致的一个直接问题是:当点击后退按钮(调用 router.go(-1))时,history中只保存了URL而丢失了params对象,进而导致依赖params的页面渲染异常。

2 解决

其实思路很简单,既然是在后退操作中丢失了params,那么我们自然会想到:如何保存一下params!没错,就是这么粗暴,你既然要丢,我就把你保存一下!

怎么存: 其实想都不用想这是一个跨组件通信问题拉,所以很自然的,用Vuex保存是最合乎常理的咯!

什么时候存:第一反应,调用 router.push({name: 'xxx', params: {xxx:123...}})时保存,然后如果导航回到这个URL,如果没有params,尝试从vuex store里取。似乎没错,就是麻烦了点儿!!别慌,咱们有导航钩子 router.beforeEach((to, from, next) => { // ... }) 啊!

正如其名,vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消。

说到这儿,你应该完全明白我的解决思路了,那下面废话就不多说了,上代码:

/*
Vuex store 定义存储对象RouterParams
*/
//...
const state = {
 //定义一个存储map,key:导航name,value:导航params
 paramMap: {}
}

const mutations = {
 REFRESHPARAM (state, paramKV) {
 //mutation,应该能看懂做的操作吧?
 Vue.set(state.paramMap, paramKV.key, paramKV.value)
 }
}
//...

/*
router中设置一个全局导航钩子
*/
const router = new VueRouter({ ... }) //router
router.beforeEach((to, from, next) => {
 // 只有在找不到params时才"出此下策"
 if (Object.keys(to.params).length === 0) {
 // 从store中取出付给params,此处注意路径未必完全吻合,以你的为准
 Object.assign(to.params, store.state.RouterParams.paramMap[to.name] || {})
 }
 // 存储一下params备用
 store.commit('REFRESHPARAM', {key: to.name, value: to.params})
 next() // 千万不要忘了,否则导航会被“掐死”在这儿。:-D
})
//...

很简单吧!总共没有几行代码 O(∩_∩)O~

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Vue  # Router后退状态保存  # Vue后退  # 保存状态  # vue-router结合vuex实现用户权限控制功能  # vue router+vuex实现首页登录验证判断逻辑  # 基于vue  # vue-router  # vuex及addRoutes进行权限控制问题  # 基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果  # vue-router+vuex addRoutes实现路由动态加载及菜单动态加载  # Vue-router 类似Vuex实现组件化开发的示例  # Vuex与Vue router的使用详细讲解  # 会有  # 很简单  # 都是  # 几个  # 我就  # 是在  # 尤其是  # 上一页  # 说了  # 什么时候  # 找不到  # 不多  # 丢失了  # 说到  # 把你  # 这是一个  # 如果没有  # 此类  # 问题是  # 写了 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 移动端脚本框架Hammer.js  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  如何用JavaScript实现文本编辑器_光标和选区怎么处理  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  Laravel如何发送系统通知?(Notification渠道示例)  Laravel如何处理和验证JSON类型的数据库字段  如何在服务器上配置二级域名建站?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何获取上海专业网站定制建站电话?  成都网站制作公司哪家好,四川省职工服务网是做什么用?  ,怎么在广州志愿者网站注册?  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  JavaScript中如何操作剪贴板_ClipboardAPI怎么用  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  EditPlus中的正则表达式 实战(4)  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  JavaScript常见的五种数组去重的方式  Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】  Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】  如何制作一个表白网站视频,关于勇敢表白的小标题?  太平洋网站制作公司,网络用语太平洋是什么意思?  Java遍历集合的三种方式  香港网站服务器数量如何影响SEO优化效果?  Android仿QQ列表左滑删除操作  如何续费美橙建站之星域名及服务?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  如何在阿里云ECS服务器部署织梦CMS网站?  悟空识字如何进行跟读录音_悟空识字开启麦克风权限与录音  北京网站制作的公司有哪些,北京白云观官方网站?  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  BootStrap整体框架之基础布局组件  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】  Laravel如何实现一对一模型关联?(Eloquent示例)  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  Linux系统命令中screen命令详解  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  昵图网官网入口 昵图网素材平台官方入口  php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】  LinuxCD持续部署教程_自动发布与回滚机制  如何破解联通资金短缺导致的基站建设难题?  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  如何在云主机上快速搭建多站点网站?  如何在阿里云部署织梦网站?  如何快速完成中国万网建站详细流程?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  html文件怎么打开证书错误_https协议的html打开提示不安全【指南】