详解使用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预览上传图片发现的问题的解决方法
Nov 25 Javascript
js判断鼠标同时离开两个div的思路及代码
May 31 Javascript
javascript动态的改变IFrame的高度实现自动伸展
Oct 12 Javascript
得到form下的所有的input的js代码
Nov 07 Javascript
通过js来制作复选框的全选和不选效果
May 22 Javascript
JQuery中DOM事件冒泡实例分析
Jun 13 Javascript
Vue 短信验证码组件开发详解
Feb 14 Javascript
Vue上传组件vue Simple Uploader的用法示例
Aug 25 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
Jun 07 Javascript
jQuery属性选择器用法实例分析
Jun 28 jQuery
vue轮播组件实现$children和$parent 附带好用的gif录制工具
Sep 26 Javascript
JS数组及对象遍历方法代码汇总
Jun 16 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
很实用的一个完整email发送程序
2006/10/09 PHP
Ajax PHP简单入门教程代码
2008/04/25 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
2009/07/07 PHP
PHP中in_array的隐式转换的解决方法
2018/03/06 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
JavaScript 存在陷阱 删除某一区域所有节点
2010/05/10 Javascript
javascript获取web应用根目录的方法
2014/02/12 Javascript
IE6浏览器中window.location.href无效的解决方法
2014/11/20 Javascript
js实现网页标题栏闪烁提示效果实例分析
2014/11/20 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
jquery与js实现全选功能的区别
2017/06/11 jQuery
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
taro开发微信小程序的实践
2019/05/21 Javascript
解决vue项目F5刷新mounted里的函数不执行问题
2019/11/05 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
微信小程序 wx.getUserInfo引导用户授权问题实例分析
2020/03/09 Javascript
微信小程序连接服务器展示MQTT数据信息的实现
2020/07/14 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
[01:07]2015国际邀请赛 中国区预选赛精彩回顾
2015/06/15 DOTA
Python中django学习心得
2017/12/06 Python
详解Python判定IP地址合法性的三种方法
2018/03/06 Python
python 读取dicom文件,生成info.txt和raw文件的方法
2019/01/24 Python
运用Python的webbrowser实现定时打开特定网页
2019/02/21 Python
python2和python3实现在图片上加汉字的方法
2019/08/22 Python
解决matplotlib.pyplot在Jupyter notebook中不显示图像问题
2020/04/22 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
《神奇的克隆》教学反思
2014/04/10 职场文书
2014年秋季开学典礼致辞
2014/08/02 职场文书
2014年组织委员工作总结
2014/12/01 职场文书
2015新学期家长寄语
2015/02/26 职场文书
政府会议通知范文
2015/04/15 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
springboot 启动如何排除某些bean的注入
2021/08/02 Java/Android