美文网首页让前端飞Web前端之路Vue.js专区
使用Vue Router导航钩子与Vuex来实现后退状态保存

使用Vue Router导航钩子与Vuex来实现后退状态保存

作者: changchao | 来源:发表于2017-09-10 23:08 被阅读895次

不好意思,标题比较啰嗦,因为这次的流水账确实属于一个比较细节的小东西,下面详细讲:

1需求

最近在使用 electron-vue 开发一个跨平台的桌面端软件,刚上手写了几个页面,遇到一个问题:桌面端软件通常会有导航需求,类似下图

导航按钮
点击返回按钮,返回上一页,并且显示上页内容。其实不止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~

附:
Vuex 文档
Vue Router 文档
Electron 文档

原文链接:http://www.jianshu.com/p/ffe029dcb210
作者: changchao 转载请注明出处

相关文章

  • 使用Vue Router导航钩子与Vuex来实现后退状态保存

    不好意思,标题比较啰嗦,因为这次的流水账确实属于一个比较细节的小东西,下面详细讲: 1需求 最近在使用 elect...

  • 面试题

    vuex工作流程 vue-router导航守卫(钩子函数) 概念:导航发生变化时,导航钩子主要用来拦截导航,让它完...

  • vue-router路由守卫

    vue-router导航钩子 vue-router导航钩子的主要作用是拦截导航,让路由完成跳转或者取消; 导航钩子...

  • 第一天

    1、简述vuex的工作流程? 2、vuex-router导航守卫(钩子函数)? 概念导航发生变化时,导航钩子主要用...

  • vue-router的认识

    vue-router中保护路由安全通常使用导航守卫来做,通过设置路由导航钩子函数的方式添加守卫.在里面判断用户状态...

  • Vue2.0一个login跳转实例

    需要解决的问题:store存储登录状态Vue-Router导航钩子拦截路由Vue-Resource获取后台的数据需...

  • 关于 vue-router 动态权限 实现的方案

    基于vue-router的动态权限实现方案vue+vue-router+vuex,利用vue-router2.2....

  • vue-router导航钩子

    用到vue-router的导航钩子的时候,发现有三类: 1 、全局导航钩子 beforeEachbeforeRes...

  • @面试题全部

    面试题第一天 1:vuex工作流程2:vue-router导航守卫(钩子函数)3:详述keep-alive组件 面...

  • Vue面试锦集

    1.Vue有哪几种导航钩子vue-router 提供的导航钩子主要用来拦截导航,让它完成跳转或取消。1.全局的 b...

网友评论

    本文标题:使用Vue Router导航钩子与Vuex来实现后退状态保存

    本文链接:https://www.haomeiwen.com/subject/dnotsxtx.html