详解使用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的开源工具PACKER2.0.2
Nov 04 Javascript
JavaScript中“+=”的应用
Feb 02 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
Jun 27 Javascript
一个简单的JS鼠标悬停特效具体方法
Jun 17 Javascript
javascript 树形导航菜单实例代码
Aug 13 Javascript
javascript的propertyIsEnumerable()方法使用介绍
Apr 09 Javascript
2014 HTML5/CSS3热门动画特效TOP10
Dec 07 Javascript
Jquery Mobile 自定义按钮图标
Nov 18 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
Oct 24 Javascript
Bootstrap 模态框实例插件案例分析
Dec 28 Javascript
几种tab切换详解
Feb 03 Javascript
详解vuejs几种不同组件(页面)间传值的方式
Jun 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
Re:从零开始的异世界生活 第2季 开播啦
2020/07/24 日漫
php中判断文件存在是用file_exists还是is_file的整理
2012/09/12 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
功能强大的php文件上传类
2016/08/29 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
广告代码静态化js通用函数
2007/05/09 Javascript
jquery的$(document).ready()和onload的加载顺序
2010/05/26 Javascript
我的javascript 函数链之演变
2011/04/07 Javascript
利用js的Node遍历找到repeater的一个字段实例介绍
2013/04/25 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
javascript中setAttribute()函数使用方法及兼容性
2015/07/19 Javascript
JS实现的车标图片提示效果代码
2015/10/10 Javascript
jsp 自动编译机制详细介绍
2016/12/01 Javascript
Bootstrap标签页(Tab)插件使用方法
2017/03/21 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
浅谈vue-router 路由传参的方法
2017/12/27 Javascript
vue form check 表单验证的实现代码
2018/12/09 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
nodeJs项目在阿里云的简单部署
2020/11/27 NodeJs
Python的爬虫程序编写框架Scrapy入门学习教程
2016/07/02 Python
Python引用传值概念与用法实例小结
2017/10/07 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
python 使用shutil复制图片的例子
2019/12/13 Python
会计毕业生自我鉴定
2013/11/04 职场文书
项目总经理岗位职责
2014/02/14 职场文书
工程技术员岗位职责
2014/03/02 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
幼儿园校园小喇叭广播稿
2014/10/17 职场文书
农村党建工作汇报材料
2014/10/27 职场文书
2015年教师党员公开承诺书
2015/01/22 职场文书
2015年教学管理工作总结
2015/05/20 职场文书
干货:企业内部人才推荐奖励方案!
2019/07/09 职场文书
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫