详解使用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 相关文章推荐
JSF中confirm弹出框的用法示例介绍
Jan 07 Javascript
Node.js模拟浏览器文件上传示例
Mar 26 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
Sep 01 Javascript
js QQ客服悬浮效果实现代码
Dec 12 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
Aug 05 Javascript
jQuery+css实现的换页标签栏效果
Jan 27 Javascript
js实现精确到毫秒的倒计时效果
Aug 05 Javascript
Linux使用Node.js建立访问静态网页的服务实例详解
Mar 21 Javascript
javascript 判断一个对象为数组的方法
May 03 Javascript
微信小程序注册60s倒计时功能 使用JS实现注册60s倒计时功能
Aug 16 Javascript
JS实现根据详细地址获取经纬度功能示例
Apr 16 Javascript
转换layUI的数据表格中的日期格式方法
Sep 19 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
使用apache模块rewrite_module (转)
2007/02/14 PHP
PHP递归算法的详细示例分析
2013/02/19 PHP
php5.3 注意事项说明
2013/07/01 PHP
thinkPHP显示不出验证码的原因与解决方法分析
2017/05/20 PHP
php+Ajax处理xml与json格式数据的方法示例
2019/03/04 PHP
tp5.1框架数据库子查询操作实例分析
2020/05/26 PHP
解放web程序员的输入验证
2006/10/06 Javascript
在javascript中对于DOM的加强
2013/04/11 Javascript
ie8 不支持new Date(2012-11-10)问题的解决方法
2013/07/31 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
2014/06/20 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
jquery分隔Url的param方法(推荐)
2016/05/25 Javascript
Javascript实现通过选择周数显示开始日和结束日的实现代码
2016/05/30 Javascript
jQuery的ready方法实现原理分析
2016/10/26 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
使用DeviceOne实现微信小程序功能
2016/12/29 Javascript
Javascript自定义事件详解
2017/01/13 Javascript
AngularJS中scope的绑定策略实例分析
2017/10/30 Javascript
vue+vuex+axios实现登录、注册页权限拦截
2018/03/09 Javascript
图文讲解vue的v-if使用方法
2019/02/11 Javascript
详解Vue中使用插槽(slot)、聚类插槽
2019/04/12 Javascript
jquery图片预览插件实现方法详解
2019/07/18 jQuery
微信小程序学习总结(三)条件、模板、文件引用实例分析
2020/06/04 Javascript
python 巧用正则寻找字符串中的特定字符的位置方法
2018/05/02 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
pycharm修改界面主题颜色的方法
2019/01/17 Python
python使用numpy实现直方图反向投影示例
2020/01/17 Python
Oracle快照(snapshot)
2015/03/13 面试题
技术人员面试提纲
2013/11/28 职场文书
护士辞职信范文
2014/01/19 职场文书
五五普法心得体会
2014/09/04 职场文书
实习推荐信格式模板
2015/03/27 职场文书
幸福终点站观后感
2015/06/04 职场文书
法制主题班会教案
2015/08/13 职场文书
创业计划书之熟食店
2019/10/16 职场文书
html5调用摄像头实例代码
2021/06/28 HTML / CSS