详解使用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 02 Javascript
JS模拟面向对象全解(一、类型及传递)
Jul 13 Javascript
jquery给图片添加鼠标经过时的边框效果
Nov 12 Javascript
webapp框架AngularUI的demo改造之路
Dec 21 Javascript
JS实现无限级网页折叠菜单(类似树形菜单)效果代码
Sep 17 Javascript
js获取url传值的方法
Dec 18 Javascript
浅析JavaScript 箭头函数 generator Date JSON
May 23 Javascript
关于JS中二维数组的声明方法
Sep 24 Javascript
angularjs2中父子组件的数据传递的实例代码
Jul 05 Javascript
探秘vue-rx 2.0(推荐)
Sep 21 Javascript
vue+mock.js实现前后端分离
Jul 24 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
Nov 07 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
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
2012/06/17 PHP
解析PHP生成静态html文件的三种方法
2013/06/18 PHP
php生成缩略图填充白边(等比缩略图方案)
2013/12/25 PHP
php实现四舍五入的方法小结
2015/03/03 PHP
Zend Framework框架实现类似Google搜索分页效果
2016/11/25 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
JS 控制小数位数的实现代码
2011/08/02 Javascript
ajax中get和post的说明及使用与区别
2012/12/23 Javascript
js判断两个日期是否相等的方法
2013/09/10 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
基于jquery实现鼠标滚轮驱动的图片切换效果
2015/10/26 Javascript
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
Eclipse编辑jsp、js文件时卡死现象的解决办法汇总
2016/02/02 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
你可能不知道的前端算法之文字避让(inMap)
2018/01/12 Javascript
搭建一个nodejs脚手架的方法步骤
2019/06/28 NodeJs
微信小程序实现点击卡片 翻转效果
2019/09/04 Javascript
vue实现带过渡效果的下拉菜单功能
2020/02/19 Javascript
Python中设置变量作为默认值时容易遇到的错误
2015/04/03 Python
Python StringIO模块实现在内存缓冲区中读写数据
2015/04/08 Python
详解Python中的元组与逻辑运算符
2015/10/13 Python
Python实现购物系统(示例讲解)
2017/09/13 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
Django框架设置cookies与获取cookies操作详解
2019/05/27 Python
html5 canvas绘制网络字体的常用方法
2019/08/26 HTML / CSS
吃透移动端 Html5 响应式布局
2019/12/16 HTML / CSS
匈牙利超级网上商店和优惠:Alza.hu
2019/12/17 全球购物
写好自荐信的技巧
2013/11/08 职场文书
老师对学生的评语
2014/04/18 职场文书
装饰公司活动策划方案
2014/08/23 职场文书
网络研修心得体会
2016/01/08 职场文书
python实现简单反弹球游戏
2021/04/12 Python
解析Java异步之call future
2021/06/14 Java/Android
Redis高可用集群redis-cluster详解
2022/03/20 Redis