vue路由切换时的动画效果
title: vue路由切换时的动画效果 id: 8a8d3844de849da54a6af3da6edac113 tags:
代码片段
vue date: 2024/09/12 18:25:44 updated: 2024/09/12 18:25:44 isPublic: true --#|[分隔]|#--
vue路由切换时的动画效果
使用vue开发页面,经常有需求想要在切换页面时添加一个动画效果,尤其移动端,切换页面时,希望新页面能从右边覆盖过来,返回上一页时,又是前一页从左边覆盖过来。
这里vue的自带组件Transition来调一下。
技术栈:vue3 + ts
官方Transition文档:https://cn.vuejs.org/guide/built-ins/transition
效果:
点击打开下一页时,新页面从右侧覆盖过来,原页面会向左偏移一些,最终被覆盖掉。
返回上一页时,上一个页面从左侧覆盖过来,原页面会向右偏移一些,最终被覆盖掉。
使用router.replace()方法替换当前页面时,不执行动画。
注意点:
需要使用全局状态记录当前是前进、回退页面,因为这个状态的修改和使用,是在不同文件中发生的。
需要自行记录当前打开过的页面历史作为一个数组,以便能判断是否是返回下一页,如果是返回上一页或者替换,需要处理这个数组。
所有的页面文件的
template标签中的标签,需要使用单独的一个标签包裹,这一点详细在本文档底部说明。
1. 新建一个pinia的store
这个文件的作用存储全局变量,来维护当前的状态,来确定当前是否是不使用动画、是前进页面、是回退页面。
新建文件 src/stores/pageTransition.ts 内容:
2. 修改路由配置文件
修改路由配置文件,这个文件一般是 src/router/index.ts。
这个文件中:
需要创建
routeStack数组,记录的已打开过页面的路由栈。创建
isReplace变量,用来记录「当前是否是替换页面」,然后重写router.replace方法,在这里面把isReplace改为 true,然后再真的去调用vue-router的替换页面的 Api。在
router.beforeEach路由守卫中添加代码,主要功能是:判断当前是替换页面、返回上一页还是正常跳新页面,然后修改全局变量src/stores/pageTransition.ts中的值。
3. App.vue中配置动画
使用 Transition 组件,并在 style 中添加动画。
Transition组件的name属性,需要取全局状态的记录值,值可能为'' | 'prev' | 'next'。添加
Transition组件添加@after-leave事件监听,也就是切换页面完成后,需要重置全局状态的记录值。Transition的执行动画时的名称,是基于name属性拼接的,所以在style中配置动画时,需要分别配置好。
至此,完成。
补充:页面文件的 template 标签中的写法
本来,vue3的组件中是可以这么写的:
但如果要使用这个页面切换效果,就不可以了,必须使用一个标签把他们都包裹起来。
因为上面第3步中的style中使用的那个类名,是直接添加到这个页面组件上面,这个组件的html代码的顶层必须是一个可以承接类名class属性的标签。
修改后的写法:
Last updated
Was this helpful?