不好意思,标题比较啰嗦,因为这次的流水账确实属于一个比较细节的小东西,下面详细讲:
<强> 1需求强>
最近在使用electron-vue开发一个跨平台的桌面端软件,刚上手写了几个页面,遇到一个问题:桌面端软件通常会有导航需求,类似下图
导航按钮
点击返回按钮,返回上一页,并且显示上页内容。其实不止应用,即使普通的网页中也会有此类需求,尤其是使用vue写温泉时。
项目中的导航几乎都是采用路由器。推动({name:“xxx”,参数:{xxx: 123…}})这种方式。这种方式导致的一个直接问题是:当点击后退按钮(调用router.go(1)时,历史中只保存了URL而丢失了参数对象,进而导致依赖params的页面渲染异常。
<强> 2解决强>
其实思路很简单,既然是在后退操作中丢失了params,那么我们自然会想到:如何保存一下params !没错,就是这么粗暴,你既然要丢,我就把你保存一下!
怎么存:其实想都不用想这是一个跨组件通信问题拉,所以很自然的,用Vuex保存是最合乎常理的咯!
什么时候存:第一反应,调用路由器。推动({name:“xxx”,参数:{xxx: 123…}})时保存,然后如果导航回到这个URL,如果没有参数,尝试从vuex商店里取。似乎没错,就是麻烦了点儿! !别慌,咱们有导航钩子路由器。beforeEach(下),从=比;{//瓆)啊!
正如其名,vue-router提供的导航钩子主要用来拦截导航,让它完成跳转或取消。
说到这儿,你应该完全明白我的解决思路了,那下面废话就不多说了,上代码:
/* Vuex商店定义存储对象RouterParams *///? const状态={//定义一个存储地图,关键:导航名称、值:导航参数 paramMap: {} } const突变={ REFRESHPARAM(状态,paramKV) {//突变,应该能看懂做的操作吧? Vue.set(状态。paramMap paramKV。键,paramKV.value) } }//? >之前
/* 路由器中设置一个全局导航钩子 */const路由器=new VueRouter ({…})//路由器 路由器。beforeEach(下),从=比;{//只有在找不到参数时才“出此下策” 如果(种(to.params)。长度===0){//从店中取出付给params,此处注意路径未必完全吻合,以你的为准 Object.assign (。params, store.state.RouterParams.paramMap [to.name] | | {}) }//存储一下params备用 store.commit (REFRESHPARAM,{关键:to.name值:to.params}) next()//千万不要忘了,否则导航会被“掐死”在这儿。:d })//? >之前很简单吧!总共没有几行代码O (∩_∩) O ~
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
详解使用Vue路由器导航钩子与Vuex来实现后退状态保存