卡比记账项目——路由与动画

85 阅读2分钟

切换动画效果

之前已经做好了四个欢迎界面,并且通过RouterLink实现跳转。

截屏2022-10-11 12.27.48.png 但是切换过程感觉比较僵硬,所以增添一下切换的动画效果。

我们发现路由中,子路由只有一个组件意味着,如果要做动画的话图中的主题部分以及下面的下一页等按钮会一起动,显得很不自然。

截屏2022-10-11 12.30.54.png

对于现有代码进行重构,在路由中使用Vue-router的多重routerview,

截屏2022-10-11 12.52.11.png 把组件进行细分。

截屏2022-10-11 12.54.13.png 给RouterView一个name就可以精准渲染每个组件了。

Vue中添加动画需要引入Transition,并且按照文档来写css

<RouterView name="main">
    {({ Component: X, route: R }: { Component: VNode, route: RouteLocationNormalizedLoaded }) =>
        <Transition enterFromClass={s.slide_fade_enter_from} enterActiveClass={s.slide_fade_enter_active}
                    leaveToClass={s.slide_fade_leave_to} leaveActiveClass={s.slide_fade_leave_active}>
            {X}
        </Transition>
    }
</RouterView>
slide_fade_enter_active,
.slide_fade_leave_active {
  position: absolute;
  left: 0;
  top: 0;
  width: 100%;
  height: 100%;
  transition: all 0.5s ease-out;
}

.slide_fade_enter_from {
  transform: translateX(100vw);
}
.slide_fade_leave_to {
  transform: translateX(-100vw);

即可实现移入移出的动画效果

QQ20221011-133627-HD.gif

使用 SVG Sprites

本项目中利用了大量的svg图标,为了实现加载第一页的时候就把后续的svg图标也加载好的优化,提前发一个图片请求。可以把整个项目用到的icon一次性加载。我们可以手写一个SVG Sprites的插件来使用。类似css雪碧图

可以不用单独引入直接使用了。具体可以看我的代码提交记录,svgstore.js文件。 截屏2022-10-11 14.05.31.png

支持滑动事件

考虑到该项目的主要使用场景为手机,所以有必要让其支持滑动事件。 使用Hooks可以实现我们的需求。(又叫composition API)

整体思路:将手指按下时的坐标记为start,离开时记为end。对比start和end坐标差距从而得知移动方向和距离。

截屏2022-10-11 15.32.34.png

变量声明:

截屏2022-10-12 13.24.23.png 滑动事件我们需要有开始时的手指坐标以及结束时的坐标。为了优化体验要添加是否处于移动状态的布尔变量。最核心的是距离和方向变量。 挂载后监听: 截屏2022-10-12 13.27.09.png 这样就实现了swipe的功能。

在我们的First组件中使用:

截屏2022-10-13 13.31.59.png 引入router,通过watchEffect来进行监听,如果用户左滑则路由跳转至'/welcome/2'。