详解使用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响应enter键的实现思路
Apr 18 Javascript
js锁屏解屏通过对$.ajax进行封装实现
Jul 31 Javascript
js函数与php函数的区别实例浅析
Jan 12 Javascript
jquery显示loading图片直到网页加载完成的方法
Jun 25 Javascript
jQuery使用Selectator插件实现多选下拉列表过滤框(附源码下载)
Apr 08 Javascript
第十章之巨幕页头缩略图与警告框组件
Apr 25 Javascript
jQuery中选择器的基础使用教程
May 23 Javascript
jQuery多文件异步上传带进度条实例代码
Aug 16 Javascript
jQuery Validation Engine验证控件调用外部函数验证的方法
Jan 18 Javascript
vue2.0中vue-cli实现全选、单选计算总价格的实例代码
Jul 18 Javascript
layui 地区三级联动 form select 渲染的实例
Sep 27 Javascript
js实现验证码干扰(动态)
Feb 23 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
openflashchart 2.0 简单案例php版
2012/05/21 PHP
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
详解PHP数组赋值方法
2015/11/07 PHP
PHP单例模式是什么 php实现单例模式的方法
2016/05/14 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
jQuery 遍历json数组的实现代码
2020/09/22 Javascript
验证码按回车不变解决方法
2013/03/29 Javascript
用jquery写的一个万年历(自写)
2014/01/20 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
浅谈angularJS中的事件
2016/07/12 Javascript
jquery获取input type=text中的值的各种方式(总结)
2016/12/02 Javascript
Bootstrap基本插件学习笔记之Alert警告框(20)
2016/12/08 Javascript
Canvas实现动态的雪花效果
2017/02/13 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
vue 实现复制内容到粘贴板clipboard的方法
2018/03/17 Javascript
vue登录以及权限验证相关的实现
2019/10/25 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
vue+elementUI中表格高亮或字体颜色改变操作
2020/11/02 Javascript
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
python实现机器人行走效果
2018/01/29 Python
python 定时修改数据库的示例代码
2018/04/08 Python
Python实现删除时保留特定文件夹和文件的示例
2018/04/27 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
TensorFlow内存管理bfc算法实例
2020/02/03 Python
python爬虫学习笔记之pyquery模块基本用法详解
2020/04/09 Python
python如何构建mock接口服务
2021/01/28 Python
Html5 实现微信分享及自定义内容的流程
2019/08/20 HTML / CSS
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
护理学毕业生自荐信
2013/10/02 职场文书
大学生职业生涯规划范文——找准自我,定位人生
2014/01/23 职场文书
函授本科自我鉴定
2014/02/04 职场文书
审计专业自荐信范文
2014/04/21 职场文书
如何在向量化NumPy数组上进行移动窗口
2021/05/18 Python
vue cli4中mockjs在dev环境和build环境的配置详情
2022/04/06 Vue.js