【项目-喵内0∞0记账-meowney-08】功能扩展包 DLC-页面会话保存sessionStorage + 路由守卫
大纲
[toc]
Vue
文档中的路由守卫
路由守卫:主要用来通过 跳转 或 取消 的方式,操控导航逻辑
- 全局路由守卫
- 全局 前置守卫
router.beforeEach(to, from, next) => {...})
- 全局 解析守卫
router.beforeResolve(to, from, next) => {...})
- 全局 后置钩子
router.afterEach(to, from,) => {...})
- 后置钩子不接受 next 函数
- 全局 前置守卫
- 单个路由,路由独享守卫
- 在路由配置
./src/router/index.ts(js)
上直接定义路由列表中每个路由对象中的属性beforeEnter: (to, from,) => {...},
- 路由独享的守卫
beforeEnter
- 与全局前置守卫的方法参数是一样的
- 在路由配置
- 组件级
- 在组件内直接定义
- 组件内守卫 配置属性
beforeRouteEnter(to, from, next) {...}
beforeRouteUpdate(to, from,) {...}
beforeRouteLeave(to, from,) {...}
- 完整的导航解析流程
导航解析流程:
- ① 触发导航 ->
- ②
beforeRouteLeave
(失活的组件内调用)-> - ③ 全局
beforeEach
-> - ④
beforeRouteUpdate
(复用的组件内调用)-> - ⑤
beforeEnter
(路由配置里调用)-> - ⑥ 异步路由组件 ->
- ⑦
beforeRouteEnter
(被激活的组件里调用)-> - ⑧ 全局
beforeResolve
-> 确认导航 -> - ⑨ 全局
afterEach
-> 触发 DOM 更新 - ⑩ 调用回调函数,
beforeRouteEnter
守卫,传给next({})
中的回调函数- 创建好的组件实例
vm
作为回调函数的参数传入next({vm=>(...)})
- 创建好的组件实例
url
查询参数的改变并 不会触发 进入/离开的 导航守卫
- 使用
watch: {...}
观察$route(to, from) {...}
对象来应对这些变化 - 使用
beforeRouteUpdate
的组件内守卫
sessionStorage
页面会话保存
需要暂存页面数据的组件
Money.vue
./store/modules/moneySessionStore.ts
Tags.vue
FormItem.vue
Tabs.vue
Numpad.vue
NumpadOutput.vue
NumpadButton.vue
修改Money.vue
- 为了暂存用户输入的数据,当用户切换页面,触发导航守卫钩子,将数据存到
sessionStorage
中
|
|
- 分别需要保存数据: 标签
tagsStore
、备注tipsStore
、日期dateStore
、收支类型typeStore
、金额amountStore
- 关闭页面,自动清除
sessionStorage
数据
./store/modules/moneySessionStore.ts
|
|
类型声明
custom.d.ts
|
|
修改Tags.vue
|
|
- 在
mounted
阶段读取session
信息,之后渲染页面 - 页面数据改变,写入相应的
session
数据
修改FormItem.vue
|
|
- 在
mounted
阶段读取session
信息,之后渲染页面 - 页面数据改变,写入相应的
session
数据
修改Tabs.vue
|
|
- 在
mounted
阶段读取session
信息,之后渲染页面 - 页面数据改变,写入相应的
session
数据
Numpad.vue
|
|
NumpadOutput.vue
NumpadButton.vue
NumpadOutput.vue
|
|
- 在
mounted
阶段读取session
信息,之后渲染页面 - 页面数据改变,写入相应的
session
数据
参考
跳转页面 路由守卫钩子 暂存页面数据
组件内路由守卫 使用vue-property-decorator
类组件 TS
装饰器
Money.vue
添加组件内的路由守卫
Money.vue
|
|
- 组件内的路由守卫放在
@Component
选项中,分别有beforeRouteEnter
|beforeRouteLeave
|beforeRouteUpate
- TS所需参数和类型为
beforeRouteEnter(to: Route, from: Route, next: NavigationGuardNext): void
- 类型由
import {NavigationGuardNext, Route} from 'vue-router';
得到
beforeRouteEnter
- 在渲染该组件的对应路由被
confirm
前调用 - 不!能!获取组件实例
this
beforeRouteEnter
守卫 不能 访问this
- 可由
next(vm=>{})
中vm
的代替 - 即通过传一个回调
vm=>{}
给next
来访问组件实例 - 在导航被确认的时候执行回调,并且把组件实例
vm
作为回调方法的参数代替this
- 因为当守卫执行前,组件实例还没被创建
- 守卫在导航确认前被调用,因此即将登场的新组件还没被创建
- 在渲染该组件的对应路由被
beforeRouteLeave
- 在当前路由改变,但是该组件被复用时调用
- 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候
- 由于会渲染同样的 Foo 组件,因此组件实例会被复用
- 而这个钩子就会在这个情况下被调用
- 可以访问组件实例
this
beforeRouteUpate
- 导航离开该组件的对应路由时调用
- 可以访问组件实例
this
参考
- Vue-Router组件内的守卫
- Vue TypeScript Handbook 类风格的组件
- vue + typescript 类组件教程
- Vue 导航守卫
- 基于类的 Vue 组件
- Vue Typescript example: Build a CRUD Application
- Vue Property Decorator github
- Vue Class Component Additional Hooks
- VUE 集成TypeScript之vue-router重构
使用vuex-ts-decorators
TS Class 组件 状态管理
Money.vue
|
|
参考文章
相关文章
- 无
- 作者: Joel
- 文章链接:
- 版权声明
- 非自由转载-非商用-非衍生-保持署名
- 河 掘 思 知 简