详解使用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 相关文章推荐
读jQuery之七 判断点击了鼠标哪个键的代码
Jun 21 Javascript
使用Jquery Aajx访问WCF服务(GET、POST、PUT、DELETE)
Mar 16 Javascript
两种常用的javascript数组去重方法思路及代码
Mar 26 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
Apr 23 Javascript
js获取UserControl内容为拼html时提供方便
Nov 02 Javascript
用JavaScript实现让浏览器停止载入页面的方法
Jan 19 Javascript
详解http访问解析流程原理
Oct 18 Javascript
Vue2.0实现组件数据的双向绑定问题
Mar 06 Javascript
vue项目打包后打开页面空白解决办法
Jun 29 Javascript
Express结合Webpack的全栈自动刷新
May 23 Javascript
微信小程序中为什么使用var that=this
Aug 27 Javascript
利用JavaScript模拟京东按键输入功能
Dec 01 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的cURL快速入门教程 (小偷采集程序)
2011/06/02 PHP
简单分析ucenter 会员同步登录通信原理
2014/08/25 PHP
laravel 解决crontab不执行的问题
2019/10/22 PHP
tagName的使用,留一笔
2006/06/26 Javascript
[原创]来自ImageSee官方 JavaScript图片浏览器
2008/01/16 Javascript
JavaScript DOM学习第一章 W3C DOM简介
2010/02/19 Javascript
jQuery each()小议
2010/03/18 Javascript
javascript基于HTML5 canvas制作画箭头组件
2014/06/25 Javascript
前端轻量级MVC框架CanJS详解
2014/09/26 Javascript
jQuery中wrapAll()方法用法实例
2015/01/16 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
js 动态给元素添加、移除事件的实现方法
2016/07/19 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
jQuery插件echarts实现的多柱子柱状图效果示例【附demo源码下载】
2017/03/04 Javascript
jQuery插件zTree实现的基本树与节点获取操作示例
2017/03/08 Javascript
Node.js中流(stream)的使用方法示例
2017/07/16 Javascript
Nodejs实现多文件夹文件同步
2018/10/17 NodeJs
微信小程序实现渐入渐出动画效果
2019/06/13 Javascript
vue实现评价星星功能
2020/06/30 Javascript
学习python类方法与对象方法
2016/03/15 Python
python回调函数中使用多线程的方法
2017/12/25 Python
Python不使用int()函数把字符串转换为数字的方法
2018/07/09 Python
Python jieba库用法及实例解析
2019/11/04 Python
windows10环境下用anaconda和VScode配置的图文教程
2020/03/30 Python
python读取xml文件方法解析
2020/08/04 Python
如何解决pycharm调试报错的问题
2020/08/06 Python
html5 localStorage本地存储_动力节点Java学院整理
2017/07/06 HTML / CSS
为中国消费者甄选天下优品:网易严选
2016/08/11 全球购物
幼儿园门卫制度
2014/01/29 职场文书
简历的自我评价
2014/02/03 职场文书
和睦家庭事迹
2014/05/14 职场文书
员工年度工作总结2015
2015/05/18 职场文书
2016春节放假通知范文
2015/08/18 职场文书
2019垃圾分类宣传口号汇总
2019/08/16 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python