【Vue-Router】路由過渡動效

在 Vue Router 中,你可以通過過渡動效(Transition Effects)為路由切換添加平滑的過渡效果,從而提升用戶體驗。過渡動效可以使用 Vue 的 <transition> 組件和 CSS 過渡來實現。

基本使用:

  1. 對導航使用動畫,需要 v-slot API:
    <router-view #default="{route,Component}"><transition  :enter-active-class="`animate__animated ${route.meta.transition}`"><component :is="Component"></component></transition></router-view>
  1. 以上會對所有的路由使用相同的過渡。如果你想讓每個路由的組件有不同的過渡,可以將元信息和動態的 name 結合在一起,放在<transition> 上:
declare module 'vue-router'{interface RouteMeta {title:string,transition:string,}
}const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',component: () => import('@/views/Login.vue'),meta:{title:"登錄頁面",transition:"animate__fadeInUp",}},{path: '/index',component: () => import('@/views/Index.vue'),meta:{title:"首頁!!!",transition:"animate__bounceIn",}}]
})

用法總結,在路由切換時添加過渡動效:

  1. 首先,你需要在你的 Vue 項目中導入 <transition> 組件。

  2. 在需要添加過渡動效的地方(通常是路由的 <router-view>),使用 <transition> 包裹你的內容。

  3. <transition> 組件添加一個 CSS 類,以便在路由切換時觸發過渡效果。

實例演示(以下實例會用到 Animation.css 庫):

在這里插入圖片描述
index.ts

import { createRouter, createWebHistory } from 'vue-router'declare module 'vue-router' {interface RouteMeta {title: string,transition: string}
}export const router = createRouter({// import.meta.env.BASE_URL 應用的基本 URL。基本 URL 是指在你的應用部署到某個域名或子路徑時,URL 的起始部分。例如,如果你的應用部署在 https://example.com/myapp/ 這個路徑下,那么 import.meta.env.BASE_URL 就會是 /myapp/。history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',component: () => import('@/views/Login.vue'),meta: {title: "登錄頁",transition: "animate__fadeIn"}},{path: '/index',component: () => import('@/views/Index.vue'),meta: {title: "首頁",transition: "animate__bounceOut"}},],
})

loadingBar.vue

<template><div class="wraps"><div ref="bar" class="bar"></div></div>
</template><script setup lang="ts">
import { ref, onMounted } from 'vue'
let speed = ref<number>(1)
let bar = ref<HTMLElement>()
let timer = ref<number>(0)
const startLoading = () => {speed.value = 1let dom = bar.value as HTMLElementtimer.value = window.requestAnimationFrame(function fn() {if (speed.value < 90) {speed.value += 1;dom.style.width = speed.value + '%'timer.value = window.requestAnimationFrame(fn)} else {speed.value = 1window.cancelAnimationFrame(timer.value)}})
}
const endLoading = () => {let dom = bar.value as HTMLElementsetTimeout(() => {window.requestAnimationFrame(() => {speed.value = 100dom.style.width = speed.value + '%'})}, 500)}defineExpose({ startLoading, endLoading })
</script><style scoped lang="less">
.wraps {width: 100%;position: fixed;height: 10px;top: 0;.bar {height: inherit;width: 0;background-color: #409eff;}
}
</style>

Index.vue

<template><h1>我進來啦</h1>
</template><script setup lang="ts"></script><style scoped></style>

Login.vue

<template><div class="login"><el-card class="box-card"><el-form ref="form" :rules="rules" :model="formInline" class="demo-form-inline"><el-form-item prop="user" label="賬號:"><el-input v-model="formInline.user" placeholder="請輸入賬號" /></el-form-item><el-form-item prop="password" label="密碼:"><el-input v-model="formInline.password" placeholder="請輸入密碼" type="password"></el-input></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">登錄</el-button></el-form-item></el-form></el-card></div>
</template><script setup lang="ts">
import { reactive, ref } from 'vue'
import { useRouter } from 'vue-router'
import type { FormItemRule, FormInstance } from 'element-plus';
import { ElMessage } from 'element-plus'const router = useRouter()
type Form = {user: string,password: string
}
type  Rules = {[k in keyof Form]?: Array<FormItemRule>
}
const formInline = reactive<Form>({user: '',password: '',
})
const form = ref<FormInstance>()
const rules = reactive({user: [{required: true,message: '請輸入賬號',type: 'string',}],password: [{required: true,message: '請輸入密碼',type: 'string',}]
})const onSubmit = () => {console.log('submit!', form.value)form.value?.validate((validate)=>{if (validate) {router.push('/index')localStorage.setItem('token', '1')} else {ElMessage.error('賬號或密碼錯誤')}})}
</script><style scoped lang="less">
.login {height: 100%;display: flex;justify-content: center;align-items: center;
}
</style>

App.vue

<template><router-view #default="{ Component, route }"><transition :enter-active-class="`animate__animated ${route.meta.transition}`"><component :is="Component"></component></transition></router-view>
</template><script setup lang="ts">
import 'animate.css'</script><style>
/* 注意 style 標簽 別加 scoped 不然設置寬高不生效 */
* {margin: 0;padding: 0;
}
html, body, #app {height: 100%;overflow: hidden;
}
</style>

main.ts

import { createApp,createVNode,render } from 'vue'
import App from './App.vue'
import {router} from './router'
// import 引入
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import loadingBar from './components/loadingBar.vue'const Vnode = createVNode(loadingBar)
render(Vnode,document.body)
const app = createApp(App)
app.use(router)
// use 注入 ElementPlus 插件
app.use(ElementPlus)const whiteList = ['/']// beforeEach 可以定義不止一個,vue會收集所有定義的路由鉤子,所以next的作用不應該是跳轉,而是使步驟進行到下一個你定義的鉤子
router.beforeEach((to, from, next) => {document.title = to.meta.titleVnode.component?.exposed?.startLoading()// token每次都要跟后端校驗一下是否過期if(whiteList.includes(to.path) || localStorage.getItem('token')){next()}else{next('/')}
})router.afterEach((to, from) => {Vnode.component?.exposed?.endLoading()
})
app.mount('#app')

可以發現在切換到首頁或者登錄頁都有過渡動效。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/38161.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/38161.shtml
英文地址,請注明出處:http://en.pswp.cn/news/38161.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HTML-文本標簽

歷史上&#xff0c;網頁的主要功能是文本展示。所以&#xff0c;HTML 提供了大量的文本處理標簽。 <div> <div>是一個通用標簽&#xff0c;表示一個區塊&#xff08;division&#xff09;。它沒有語義&#xff0c;如果網頁需要一個塊級元素容器&#xff0c;又沒有…

leetcode 494. 目標和

2023.8.14 一杯茶&#xff0c;一包煙&#xff0c;一道dp做一天... ps&#xff1a;nums[i]均大于等于0。本題先轉化為0-1背包問題&#xff1a;將數組元素分成兩堆&#xff1a;一堆為正號&#xff0c;另一堆為負號。設正號堆的和為x&#xff0c;則負號堆的和為sum-x。&#xff08…

CentOS系統環境搭建(十)——CentOS7定時任務

centos系統環境搭建專欄&#x1f517;點擊跳轉 使用CentOS系統環境搭建&#xff08;九&#xff09;——centos系統下使用docker部署項目的項目做定時任務。 CentOS7定時任務 查看現有的定時任務 crontab -l編輯定時任務 crontab -e示例 每天凌晨兩點運行腳本 清理內存 0 2 *…

【Linux的開胃小菜】常用的RPM軟件包與YUM倉庫包管理器使用

一、系統初始化進程 systemd與System V init的區別以及作用&#xff1a; System V init運行級別systemd目標名稱systemd目標作用0poweroff.target關機1rescue.target單用戶模式2multi-user.target多用戶的文本界面3multi-user.target多用戶的文本界面4multi-user.target多用戶…

【SpringBoot】88、SpringBoot中使用Undertow替代Tomcat容器

SpringBoot 中我們既可以使用 Tomcat 作為 Http 服務,也可以用 Undertow 來代替。Undertow 在高并發業務場景中,性能優于 Tomcat。所以,如果我們的系統是高并發請求,不妨使用一下 Undertow,你會發現你的系統性能會得到很大的提升。 1、Tomcat 介紹 Tomcat是一個開源的Ja…

【數據結構】“單鏈表”的練習題(二)

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;個人主頁 &#xff1a;阿然成長日記 …

Django框架 靚號管理(增刪改查)

Django框架 靚號管理&#xff08;增刪改查&#xff09; 新建一個項目 backend 使用pycharm創建app startapp app項目目錄 C:\code\backend ├── app | ├── admin.py | ├── apps.py | ├── migrations | ├── models.py | ├── tests.py | ├── views.…

關于微信臨時文件wxfile://tmp文件如何處理,微信小程序最新獲取頭像和昵稱

分享-2023年資深前端進階&#xff1a;前端登頂之巔-最全面的前端知識點梳理總結&#xff0c;前端之巔 *分享一個使用比較久的&#x1fa9c; 技術棧&#xff1a;taro框架 vue3版本 解決在微信小程序獲取微信頭像時控制臺報錯&#xff1a;找不著wxfile://tmp 文件路徑,失敗&…

java spring cloud 企業電子招標采購系統源碼:營造全面規范安全的電子招投標環境,促進招投標市場健康可持續發展 tbms

? 項目說明 隨著公司的快速發展&#xff0c;企業人員和經營規模不斷壯大&#xff0c;公司對內部招采管理的提升提出了更高的要求。在企業里建立一個公平、公開、公正的采購環境&#xff0c;最大限度控制采購成本至關重要。符合國家電子招投標法律法規及相關規范&#xff0c;以…

支持M1 Syncovery for mac 文件備份同步工具

Syncovery for Mac 是一款功能強大、易于使用的文件備份和同步軟件&#xff0c;適用于需要備份和同步數據的個人用戶和企業用戶。Syncovery 提供了一個直觀的用戶界面&#xff0c;使用戶可以輕松設置備份和同步任務。用戶可以選擇備份的文件類型、備份目錄、備份頻率等&#xf…

解讀2023年上半年財報:營收凈利雙增長,珀萊雅離高端還有多遠?

夏季炎熱&#xff0c;防曬類產品的銷量暴漲。根據千牛數據&#xff0c;防曬衣今年5月全網搜索人數同比增長15%&#xff0c;加購人數同比增長29.8%&#xff0c;訪問人數同比增加42%。消費者狂熱的防曬需求&#xff0c;孕育著巨大的商機&#xff0c;許多企業開始瞄準這一機會。而…

在Windows和MacOS環境下實現批量doc轉docx,xls轉xlsx

一、引言 Python中批量進行辦公文檔轉化是常見的操作&#xff0c;在windows狀態下我們可以利用changeOffice這個模塊很快進行批量操作。 二、在Windows環境下的解決文案 Windows環境下&#xff0c;如何把doc轉化為docx&#xff0c;xls轉化為xlsx&#xff1f; 首先&#xff…

mysql三大日志—— 二進制日志binlog

binlog用于記錄數據庫執行的寫入性操作&#xff0c;由服務層進行記錄&#xff0c;通過追加的方式以二進制的形式保存在磁盤中。 binlog主要用于主從復制和數據恢復。 主從復制&#xff1a;在主機端開啟binlog&#xff0c;然后將binlog發送到各個從機&#xff0c;從機存放binl…

sykwalking8.2和mysql5.7快速部署

1.SkyWalking 是什么&#xff1f; 分布式系統的應用程序性能監視工具&#xff0c;專為微服務、云原生架構和基于容器&#xff08;Docker、K8s、Mesos&#xff09;架構而設計。 提供分布式追蹤、服務網格遙測分析、度量聚合和可視化一體化解決方案。 2.SkyWalking 有哪些功能…

Spring Task入門案例

Spring Task 是Spring框架提供的任務調度工具&#xff0c;可以按照約定的時間自動執行某個代碼邏輯。 定位&#xff1a;定時任務框架 作用&#xff1a;定時自動執行某段Java代碼 強調&#xff1a;只要是需要定時處理的場景都可以使用Spring Task 1. cron表達式 cron表達式…

Java多線程線程間的通信—wait及notify方法

線程間的相互作用 線程間的相互作用:線程之間需要一些協調通信,來共同完成一件任務。 Object類中相關的方法有兩個notify方法和三個wait方法: Object (Java Platform SE 7 ) 因為wait和notify方法定義在Object類中,因此會被所有的類所繼承。 這些方法都是final的,即它們…

樹形dp模板

285. 沒有上司的舞會 - AcWing題庫 #include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include&…

Visual Studio 與QT ui文件

對.ui文件鼠標右鍵&#xff0c;然后單擊 Open with…在彈出的窗口中&#xff0c;選中左側的 Qt Designer&#xff0c;然后單擊右側的 Add 按鈕&#xff0c;隨后會彈出一個窗口&#xff0c;在 Program: 輸入框中輸入 Qt Designer 的路徑&#xff0c;最后單擊 OK找到 Qt Designer…

內網ip與外網ip

一、關于IP地址 我們平時直接接觸最多的是內網IP。而且還可以自己手動修改ip地址。而外網ip&#xff0c;我們很少直接接觸&#xff0c;都是間接接觸、因為外網ip一般都是運營商管理&#xff0c;而且是全球唯一的&#xff0c;一般我們自己是無法修改的。 內網IP和外網IP是指在…

突破大模型 | Alluxio助力AI大模型訓練-成功案例(一)

更多詳細內容可見《Alluxio助力AI大模型訓練制勝寶典》 【案例一&#xff1a;知乎】多云緩存在知乎的探索:從UnionStore到Alluxio 作者&#xff1a;胡夢宇-知乎大數據基礎架構開發工程師&#xff08;內容轉載自InfoQ&#xff09; 一、背景 隨著云原生技術的飛速發展&#xff…