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


Posted in Javascript onSeptember 11, 2017

不好意思,标题比较??拢?蛭?獯蔚牧魉?巳肥凳粲谝桓霰冉舷附诘男《?鳎?旅嫦晗附玻?/p>

1需求

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

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

导航按钮

点击返回按钮,返回上一页,并且显示上页内容。其实不止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~

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

Javascript 相关文章推荐
(转载)JavaScript中匿名函数,函数直接量和闭包
May 08 Javascript
javascript 另一种图片滚动切换效果思路
Apr 20 Javascript
深入浅析JSON.parse()、JSON.stringify()和eval()的作用详解
Apr 03 Javascript
基于d3.js实现实时刷新的折线图
Aug 03 Javascript
VUE JS 使用组件实现双向绑定的示例代码
Jan 10 Javascript
原生js实现商品放大镜效果
Jan 12 Javascript
jQuery窗口拖动功能的实现代码
Feb 04 Javascript
jQuery EasyUI的TreeGrid查询功能实现方法
Aug 08 jQuery
解决vue处理axios post请求传参的问题
Mar 05 Javascript
详解使用 Node.js 开发简单的脚手架工具
Jun 08 Javascript
js脚本中执行java后台代码方法解析
Oct 11 Javascript
Node登录权限验证token验证实现的方法示例
May 25 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
Sep 11 #jQuery
详解webpack2+React 实例demo
Sep 11 #Javascript
react-native 完整实现登录功能的示例代码
Sep 11 #Javascript
Layui table 组件的使用之初始化加载数据、数据刷新表格、传参数
Sep 11 #Javascript
Vuejs 页面的区域化与组件封装的实现
Sep 11 #Javascript
js封装成插件的步骤方法
Sep 11 #Javascript
vue.js移动端app之上拉加载以及下拉刷新实战
Sep 11 #Javascript
You might like
分页详解 从此分页无忧(PHP+mysql)
2007/11/23 PHP
php导出中文内容excel文件类实例
2015/07/06 PHP
Javascript的构造函数和constructor属性
2010/01/09 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
JQuery 1.3.2以上版本中出现pareseerror错误的解决方法
2011/01/11 Javascript
通过js获取div的background-image属性
2013/10/15 Javascript
js的参数有长度限制吗?发现不能超过2083个字符
2014/04/20 Javascript
javascript实现复选框选中属性
2015/03/25 Javascript
javascript动态设置样式style实例分析
2015/05/13 Javascript
数据分析软件之FineReport教程:[5]参数界面JS(全)
2015/08/13 Javascript
javascript引用类型之时间Date和数组Array
2015/08/27 Javascript
理解javascript函数式编程中的闭包(closure)
2016/03/08 Javascript
javascript基础知识
2016/06/07 Javascript
JavaScript对象数组如何按指定属性和排序方向进行排序
2016/06/15 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
AngularJS中run方法的巧妙运用
2017/01/04 Javascript
详解原生js实现offset方法
2017/06/15 Javascript
详解用webpack的CommonsChunkPlugin提取公共代码的3种方式
2017/11/09 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
以一段代码为实例快速入门Python2.7
2015/03/31 Python
Python面向对象类的继承实例详解
2018/06/27 Python
Python实现常见的回文字符串算法
2018/11/14 Python
python实现简单五子棋游戏
2019/06/18 Python
Django Channel实时推送与聊天的示例代码
2020/04/30 Python
基于Tensorflow读取MNIST数据集时网络超时的解决方式
2020/06/22 Python
IE滤镜与CSS3效果(详细整理分享)
2013/01/25 HTML / CSS
澳洲的服装老品牌:SABA
2018/02/06 全球购物
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
Optimalprint加拿大:在线打印服务
2020/04/03 全球购物
波兰办公用品和学校用品在线商店:Dlabiura24.pl
2020/11/18 全球购物
AJax面试题
2014/11/25 面试题
超市实习总结自我鉴定
2013/09/19 职场文书
电气自动化个人求职信范文
2014/02/03 职场文书
2014年图书管理员工作总结
2014/12/01 职场文书
《家庭教育》读后感3篇
2019/12/18 职场文书