详解使用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 27 Javascript
iframe的onload在Chrome/Opera中执行两次Bug的解决方法
Mar 17 Javascript
浅谈JS闭包中的循环绑定处理程序
Nov 09 Javascript
node.js操作mongoDB数据库示例分享
Nov 26 Javascript
jQuery中ready事件用法实例
Jan 19 Javascript
javascript中setTimeout使用指南
Jul 26 Javascript
JS+CSS实现自适应选项卡宽度的圆角滑动门效果
Sep 15 Javascript
ECHO.js 纯javascript轻量级延迟加载的实例代码
May 24 Javascript
js通过classname来获取元素的方法
Nov 24 Javascript
JavaScript组成、引入、输出、运算符基础知识讲解
Dec 08 Javascript
vue.js实现左边导航切换右边内容
Oct 21 Javascript
非常漂亮的js烟花效果
Mar 10 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 REMOTE_ADDR之获取访客IP的代码
2008/04/22 PHP
PHP批量生成缩略图的代码
2008/07/19 PHP
PHP制作图形验证码代码分享
2014/10/23 PHP
[原创]PHP实现字节数Byte转换为KB、MB、GB、TB的方法
2017/08/31 PHP
基于jQuery的自动完成插件
2011/02/03 Javascript
一行代码告别document.getElementById
2012/06/01 Javascript
js事件冒泡实例分享(已测试)
2013/04/23 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
js命名空间写法示例
2015/12/18 Javascript
JavaScript常用数组算法小结
2016/02/13 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
JavaScript reduce和reduceRight详解
2016/10/24 Javascript
JavaScript图片处理与合成总结
2018/03/04 Javascript
JavaScript实现图片放大镜效果
2019/06/27 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
详细分析JavaScript中的深浅拷贝
2020/09/17 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
微信小程序实现列表左右滑动
2020/11/19 Javascript
python判断windows隐藏文件的方法
2014/03/21 Python
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
python实现发送邮件功能
2017/07/22 Python
python 对象和json互相转换方法
2018/03/22 Python
python跳出双层for循环的解决方法
2019/06/24 Python
pandas基于时间序列的固定时间间隔求均值的方法
2019/07/04 Python
Django认证系统user对象实现过程解析
2020/03/02 Python
幼儿园教师教学反思
2014/02/06 职场文书
认购协议书范本
2014/04/22 职场文书
史学专业毕业生求职信
2014/05/09 职场文书
个人安全生产承诺书
2014/05/22 职场文书
学习十八届四中全会精神思想汇报
2014/10/23 职场文书
学校2014年度工作总结
2014/12/06 职场文书
八年级作文之友情
2019/11/25 职场文书
python中的sys模块和os模块
2022/03/20 Python