详解使用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无法设置checkbox选中即没有变成选中状态
Mar 27 Javascript
jquery选择器需要注意的问题
Nov 26 Javascript
AngularJS使用ngOption实现下拉列表的实例代码
Jan 23 Javascript
基于jquery实现ajax无刷新评论
Aug 19 Javascript
Node.js环境下JavaScript实现单链表与双链表结构
Jun 12 Javascript
vue实现键盘输入支付密码功能
Aug 18 Javascript
微信小程序按钮去除边框线分享页面功能
Aug 27 Javascript
Bootstrap模态对话框用法简单示例
Aug 31 Javascript
又拍云 Node.js 实现文件上传、删除功能
Oct 28 Javascript
在Vue项目中使用jsencrypt.js对数据进行加密传输的方法
Apr 17 Javascript
使用layui实现树形结构的方法
Sep 20 Javascript
通过实例了解JS执行上下文运行原理
Jun 17 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库功能简介 抓取网页、POST数据及其他
2011/04/07 PHP
php 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
php笔记之:php函数range() round()和list()的使用说明
2013/04/26 PHP
php格式化日期和时间格式化示例分享
2014/02/24 PHP
symfony表单与页面实现技巧
2015/01/26 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
php-msf源码详解
2017/12/25 PHP
jquery EasyUI的formatter格式化函数代码
2011/01/12 Javascript
删除节点的jquery代码
2014/01/13 Javascript
jquery结合CSS使用validate实现漂亮的验证
2015/01/29 Javascript
JQuery入门基础小实例(1)
2015/09/17 Javascript
Bootstrap CSS布局之表格
2016/12/17 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
JS typeof fn === 'function' && fn()详解
2020/08/22 Javascript
[05:56]第十六期——新进3大C之小兔基
2014/06/24 DOTA
python更新列表的方法
2015/07/28 Python
Python中模块string.py详解
2017/03/12 Python
Python之py2exe打包工具详解
2017/06/14 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
浅谈Pandas中map, applymap and apply的区别
2018/04/10 Python
python中的字符串内部换行方法
2018/07/19 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
Python3操作YAML文件格式方法解析
2020/04/10 Python
Django 构建模板form表单的两种方法
2020/06/14 Python
利用python汇总统计多张Excel
2020/09/22 Python
CSS3用@font-face实现自定义英文字体
2013/09/23 HTML / CSS
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
办公室保洁员岗位职责
2013/12/02 职场文书
初中毕业典礼演讲稿
2014/09/09 职场文书
火烧圆明园的观后感
2015/06/03 职场文书
Vue.js 带下拉选项的输入框(Textbox with Dropdown)组件
2021/04/17 Vue.js
详解JavaScript的计时器和按钮效果设置
2022/02/18 Javascript