详解使用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 相关文章推荐
一个选择最快的服务器转向代码
Apr 27 Javascript
百度留言本js 大家可以参考下
Oct 13 Javascript
使用js声明数组,对象在jsp页面中(获得ajax得到json数据)
Nov 05 Javascript
js实现的二分查找算法实例
Jan 21 Javascript
完善的jquery处理机制
Feb 21 Javascript
Node.js如何响应Ajax的POST请求并且保存为JSON文件详解
Mar 10 Javascript
JS库中的Particles.js在vue上的运用案例分析
Sep 13 Javascript
jQuery基于随机数解决中午吃什么去哪吃问题示例
Dec 29 jQuery
React 使用Hooks简化受控组件的状态绑定
Mar 18 Javascript
Vue项目实现简单的权限控制管理功能
Jul 17 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
Aug 13 Javascript
在vue中使用image-webpack-loader实例
Nov 12 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定时计划任务与fsockopen持续进程实例
2014/05/23 PHP
PHP将身份证正反面两张照片合成一张图片的代码
2017/04/08 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
基于JQuery的cookie插件
2010/04/07 Javascript
原生js实现shift/ctrl/alt按键的获取
2013/04/08 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
简介JavaScript中substring()方法的使用
2015/06/06 Javascript
JavaScript识别网页关键字并进行描红的方法
2015/11/09 Javascript
javascript实现C语言经典程序题
2015/11/29 Javascript
jQuery通用的全局遍历方法$.each()用法实例
2016/07/04 Javascript
使用AngularJS2中的指令实现按钮的切换效果
2017/03/27 Javascript
jQuery实现多张图片上传预览(不经过后端处理)
2017/04/29 jQuery
JavaScript之Map和Set_动力节点Java学院整理
2017/06/29 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
微信小程序wx.navigateTo中events属性实现页面间通信传值,数据同步
2019/07/13 Javascript
jQuery高级编程之js对象、json与ajax用法实例分析
2019/11/01 jQuery
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
使用Python判断IP地址合法性的方法实例
2014/03/13 Python
基于python实现微信模板消息
2015/12/21 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
使用paramiko远程执行命令、下发文件的实例
2017/10/01 Python
Python实现霍夫圆和椭圆变换代码详解
2018/01/12 Python
tensorflow训练中出现nan问题的解决
2018/02/10 Python
5款Python程序员高频使用开发工具推荐
2019/04/10 Python
python操作kafka实践的示例代码
2019/06/19 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
HTML5 canvas基本绘图之文字渲染
2016/06/27 HTML / CSS
HTML5本地存储之IndexedDB
2017/06/16 HTML / CSS
面试求职的个人自我评价
2013/11/16 职场文书
员工考核管理制度
2014/02/02 职场文书
美食节策划方案
2014/05/26 职场文书
2014年驻村干部工作总结
2014/11/17 职场文书
先进事迹材料范文
2014/12/29 职场文书
总账会计岗位职责
2015/04/02 职场文书
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL