Vue3项目中加载动画的实现

前言

1. 有关路由懒加载

正常路由的引入方式通常会导致网页首屏加载时间过长,给用户带来不好的体验,所以我们通常使用路由懒加载的方式来引入路由,这样只会在使用到某个路由时才会去加载它,减少了初次加载的时间。

// 正常引入

import TimeKeep from '@/view/TimeKeep.vue'
routes: [
    {
      path: '/',
      redirect: '/time-keep'
    },
    {
      path: '/time-keep',
      component: TimeKeep
    }
]

// 懒加载

routes: [
    {
      path: '/',
      redirect: '/time-keep'
    },
    {
      path: '/time-keep',
      component: () => import('@/view/TimeKeep.vue')
    }
]

2. 路由懒加载带来的问题及需求

使用路由懒加载时,访问未访问过的路由时,需要去加载该路由,所以会有明显停顿和等待的时间,然后才切换至该路由,用户体验较差。我希望能够在访问新路由时先进入加载界面,路由加载完毕后隐藏加载界面。在访问过某个路由一次后,该路由就被加载了,再次访问时就不会有停顿的出现,所以我希望加载动画只在首次访问某个路由时出现。

3.有关调试

本地调试时几乎没有延迟,我们可以在控制台模拟较差的网络环境以方便我们调试。

效果

1. 开屏加载

2. 切换路由时加载

3. 切换至已加载过的路由时不会播放加载动画

实现

1. 在App.vue中添加加载界面的结构和样式代码。当然写成组件然后在此引入也是可以的。

<template>
    <!-- 加载界面 -->
    <Transition name="loading">
        <div v-if="loading" class="loader-wrapper">
            <span class="loader">
                <span class="loader-inner"></span>
            </span>
        </div>
    </Transition>
    <!-- 主界面 -->
    <MainLayout></MainLayout>
</template>
<style scoped>
.loader-wrapper {
    position: absolute;
    left: 0;
    top: 0;
    height: 100vh;
    width: 100wh;
    background-color: white;
    display: flex;
    justify-content: center;
    align-items: center;
}
.loader {
    display: inline-block;
    width: 30px;
    height: 30px;
    position: relative;
    border: 4px solid #42b883;
    animation: loader 2s infinite ease;
}

.loader-inner {
    vertical-align: top;
    display: inline-block;
    width: 100%;
    background-color: #42b883;
    animation: loader-inner 2s infinite ease-in;
}

// 加载界面动画
@keyframes loader {
  0% {
    transform: rotate(0deg);
  }

  25% {
    transform: rotate(180deg);
  }

  50% {
    transform: rotate(180deg);
  }

  75% {
    transform: rotate(360deg);
  }

  100% {
    transform: rotate(360deg);
  }

}
@keyframes loader-inner {
  0% {
    height: 0%;
  }

  25% {
    height: 0%;
  }

  50% {
    height: 100%;
  }

  75% {
    height: 100%;
  }

  100% {
    height: 0%;
  }

}

.loading-move,
.loading-enter-active,
.loading-leave-active {
  transition: all 0.5s ease-in-out;
}

.loading-enter-from,
.loading-leave-to {
  opacity: 0 !important;
}
</style>

你可以修改上面的代码将其换成你喜欢的加载动画。这里推荐一个优秀的前端代码片段网站:https://codepen.io/,你可以在里面找到很多炫酷的页面效果。

2. 使用mitt来注册一个全局事件来控制加载界面的显示与否

现在我们写好了加载界面,不过它一直显示在主界面的上方。我们的需求是在初始加载和首次切换至某个路由时显示加载界面。

<script lang="ts" setup>
import { onUnmounted, ref } from 'vue'
import MainLayout from './components/layout/MainLayout.vue'

const loading = ref(true)

// 注册控制加载事件
import emitter from './utils/emitter'
emitter.on('loading', (b) => {
    loading.value = b as boolean
})
onUnmounted(() => {
    emitter.off('loading')
})

</script>

通过loading变量和条件渲染搭配控制界面的显示,通过调用'loading'全局事件并传入布尔值来修改loading变量的值。loading初始值设置为true

3. 这里使用的emitter需要进行安装和引入。

npm install mitt 

新建utils/emitter.ts。内容如下 

/**
 * emitter
 * 
 * .on 绑定事件
 * .off 解绑事件
 * .emit 触发事件
 */

import mitt from 'mitt'

const emitter = mitt()

export default emitter

4. 在router配置文件中添加路由守卫, 并创建一个Set集合用于记录已经访问过的路由

import emitter from '@/utils/emitter'

// 创建一个全局状态来管理首次访问状态
const visitedRoutes = new Set()

// 路由守卫
router.beforeEach((to, from, next) => {
  if (!visitedRoutes.has(to.path)) {
    emitter.emit('loading', true)
  }
  next()
})

router.afterEach((to) => {
  if (!visitedRoutes.has(to.path)) {
    visitedRoutes.add(to.path)
    emitter.emit('loading', false)
  }
})

在路由守卫中进行处理:

- 访问路由前:如果将要访问的路由不在Set集合中,触发全局事件显示加载界面

- 访问路由后:如果当前路由不在Set集合中,将当前路由的path添加至Set集合中,并触发全局事件隐藏加载界面

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue3实现首屏加载动画,你可以参考以下步骤: 1. 首先,在你的Vue项目创建一个全局加载组件,用于展示加载动画。你可以在组件使用CSS或动画库来定义你想要的加载效果。 2. 在你的根组件(通常是App.vue引入并注册这个全局加载组件。 3. 在页面加载的过程,使用Vue的生命周期钩子函数(如created或mounted)来控制加载动画的显示和隐藏。在页面加载之前,显示加载动画加载完成后,隐藏加载动画。 4. 如果你想要自定义加载动画的样式,你可以在全局加载组件定义样式,并在组件使用<slot>标签来插入内容。 5. 最后,你可以根据你的需求在加载动画组件添加文本或图标来显示加载状态,以提供更好的用户体验。 请注意,加载动画和数据请求的组件不应同时使用,以免出现两个加载效果。另外,要谨慎使用全局加载动画,因为它会在整个应用程序显示。 这是一个简单的示例代码,展示了如何在Vue3实现首屏加载动画: ```vue // 在全局加载组件定义加载动画的样式和内容 <template> <div class="loading"> <div class="loader"></div> <p>Loading...</p> </div> </template> <script> export default { name: 'Loading', // 根据需要可以添加进入、离开过渡效果 // 可以使用CSS或动画库定义加载动画的样式 // 在created或mounted钩子函数控制显示和隐藏 created() { // 显示加载动画 }, mounted() { // 隐藏加载动画 } } </script> // 在根组件引入并注册全局加载组件 <template> <div id="app"> <router-view /> <Loading v-if="isLoading" /> </div> </template> <script> import Loading from '@/components/Loading.vue'; export default { name: 'App', components: { Loading }, data() { return { isLoading: true } }, created() { // 页面加载前显示加载动画 }, mounted() { // 页面加载完成后隐藏加载动画 } } </script> ``` 这样,当你的Vue应用程序加载时,首屏将会显示加载动画加载完成后加载动画将会被隐藏。你可以根据自己的需求自定义加载动画的样式和内容。记得根据实际情况在合适的生命周期钩子函数控制加载动画的显示和隐藏。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue实现页面加载动画效果](https://download.csdn.net/download/weixin_38721565/12772582)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Vue实现网页首屏加载动画页面内请求数据加载loading](https://blog.csdn.net/weixin_48337566/article/details/127896990)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值