详解使用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 相关文章推荐
JS提交并解析后台返回的XML的代码
Nov 03 Javascript
jquery插件 cluetip 关键词注释
Jan 12 Javascript
jquery checkbox全选、取消全选实现代码
Mar 05 Javascript
JavaScript获取onclick、onchange等事件值的代码
Jul 22 Javascript
原生javascript实现获取指定元素下所有后代元素的方法
Oct 28 Javascript
AngularJS入门教程之Hello World!
Dec 06 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
Nov 02 Javascript
理解javascript对象继承
Apr 17 Javascript
JS实现重新加载当前页面或者父页面的几种方法
Nov 30 Javascript
JS SetInterval 代码实现页面轮询
Aug 11 Javascript
Vue项目页面跳转时浏览器窗口上方显示进度条功能
Mar 26 Javascript
Vue实现购物车实例代码两则
May 30 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 采集心得技巧
2009/05/15 PHP
为PHP5.4开启Zend OPCode缓存
2014/12/26 PHP
PHP aes (ecb)解密后乱码问题
2015/06/22 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
2016/04/02 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
Nigma vs AM BO3 第二场2.13
2021/03/10 DOTA
JS的递增/递减运算符和带操作的赋值运算符的等价式
2007/12/08 Javascript
jQuery 1.5.1 发布,全面支持IE9 修复大量bug
2011/02/26 Javascript
js正则表达exec与match的区别说明
2014/01/29 Javascript
js从Cookies里面取值的简单实现
2014/06/30 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
vue-resource 拦截器(interceptor)的使用详解
2017/07/04 Javascript
详解Angular-cli生成组件修改css成less或sass的实例
2017/07/27 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
Vue通过ref父子组件拿值方法
2018/09/12 Javascript
Python中解析JSON并同时进行自定义编码处理实例
2015/02/08 Python
用实例详解Python中的Django框架中prefetch_related()函数对数据库查询的优化
2015/04/01 Python
对于Python的Django框架使用的一些实用建议
2015/04/03 Python
快速了解Python相对导入
2018/01/12 Python
Python 读取指定文件夹下的所有图像方法
2018/04/27 Python
Sanic框架异常处理与中间件操作实例分析
2018/07/16 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
Python英文文本分词(无空格)模块wordninja的使用实例
2019/02/20 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
python GUI库图形界面开发之PyQt5信号与槽基本操作
2020/02/25 Python
利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)
2020/09/04 Python
Python绘制数码晶体管日期
2021/02/19 Python
CSS3实现可翻转的hover效果
2018/05/23 HTML / CSS
Stuart Weitzman欧盟:美国奢华鞋履品牌
2017/05/24 全球购物
莱德杯高尔夫欧洲官方商店:Ryder Cup Shop
2019/08/14 全球购物
平面设计求职信
2014/03/10 职场文书
活动总结怎么写
2014/04/28 职场文书
离职保密承诺书
2014/05/28 职场文书
2015中秋节慰问信范文
2015/03/23 职场文书
jQuery ajax - getScript() 方法和getJSON方法
2021/05/14 jQuery