vue頁(yè)面切換項(xiàng)目實(shí)現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的方法
前言
移動(dòng)端, 使用vue為了良好的用戶體驗(yàn), 會(huì)需要實(shí)現(xiàn)APP形式的切換頁(yè)面的左滑和右滑效果
實(shí)現(xiàn)原理, vue的過(guò)渡 & 動(dòng)畫(huà)
技術(shù)棧: vue + vue-router
解決思路
區(qū)分前進(jìn) 和 后退的路由
網(wǎng)上搜索的資料, 找到了兩種
監(jiān)聽(tīng)popstate事件
window.addEventListener('popstate', function (e) { // 用來(lái)判斷是否是后退, 在判斷后需要在其他地方重置 router.isBack = true },false)
在注冊(cè)路由的時(shí), 添加 meta對(duì)象 ( 路由元信息)中添加索引, 這樣做就需要注意索引的大小(這里使用這一種方式)
{ path: "/login", component: resolve => require(["@/pages/login"], resolve), meta: { title: "登錄", keepAlive: false, index: 1 } }, { path: "/forward", name: "Forward", component: resolve => require(["@/pages/forward"], resolve), meta: { title: "前進(jìn)", keepAlive: true, index: 2 } },
根據(jù)切換方向設(shè)置不同的動(dòng)畫(huà)效果(通過(guò)給transtion內(nèi)置組件不同的name選項(xiàng))
方案
路由注冊(cè)
{ path: "/login", component: resolve => require(["@/pages/login"], resolve), meta: { title: "登錄", keepAlive: false, // 用來(lái)判斷是否緩存, 當(dāng)判斷為緩存時(shí), 則路由信息的name和組件的name選項(xiàng)需一致 index: 1, // 通過(guò)比較不同的索引, 來(lái)判斷是前進(jìn)動(dòng)畫(huà)還是后退動(dòng)畫(huà) } }, { path: "/forward", name: "Forward", component: resolve => require(["@/pages/forward"], resolve), meta: { title: "前進(jìn)", keepAlive: true, index: 2 } },
在App.vue(根組件)中, 判斷動(dòng)畫(huà)方向
<template> <div id="project"> <!-- <keep-alive> <router-view v-if="$route.meta.keepAlive"></router-view> </keep-alive> <router-view v-if="!$route.meta.keepAlive"></router-view> 這種情況下, :include: 因?yàn)槿羰鞘褂胻ransition包裹兩個(gè)keep-alive, vue會(huì)出現(xiàn)報(bào)錯(cuò) 用兩個(gè)transition分別包裹keep-alive, 會(huì)讓transition的動(dòng)畫(huà)name出現(xiàn)問(wèn)題 --> <transition :name="transitionName"> <keep-alive :include="cachedViews"> <router-view :key="1"></router-view> </keep-alive> </transition> </div> </template> <script> export default { name: "App", data() { return { transitionName: "slide-right", // 初始過(guò)渡動(dòng)畫(huà)方向 cachedViews: [] // 緩存組件 }; }, components: {}, created() {}, watch: { $route(to, from) { if (to.meta.keepAlive && !this.cachedViews.includes(to.name)) { // 將需要緩存的組件信息, 添加進(jìn)其中, 其中to.name的值應(yīng)該和匹配組件的name選項(xiàng)一致 this.cachedViews.push(to.name); } //如果to索引大于from索引,判斷為前進(jìn)狀態(tài),反之則為后退狀態(tài) if (to.meta.index > from.meta.index) { //設(shè)置動(dòng)畫(huà)名稱 this.transitionName = "slide-left"; } else { this.transitionName = "slide-right"; } } }, methods: {} }; </script> <style lang="scss" scoped> .slide-right-enter-active, .slide-right-leave-active, .slide-left-enter-active, .slide-left-leave-active { will-change: transform; transition: all 0.5s; <!-- 這個(gè)是必須的, 是為了讓頁(yè)面脫離文檔流, 不然的話, 后進(jìn)入的頁(yè)面會(huì)從頁(yè)面底部出來(lái) 這個(gè)定位會(huì)直接添加到路由匹配的組件根元素上, 所以頁(yè)面根組件最好設(shè)定其寬度為100vw --> width: 100vw; position: absolute; } .slide-right-enter { opacity: 0; transform: translate3d(-100%, 0, 0); } .slide-right-leave-active { opacity: 0; transform: translate3d(100%, 0, 0); } .slide-left-enter { opacity: 0; transform: translate3d(100%, 0, 0); } .slide-left-leave-active { opacity: 0; transform: translate3d(-100%, 0, 0); } </style>
待解決問(wèn)題
- 子路由問(wèn)題
子路由還沒(méi)有考慮到
- 緩存組件問(wèn)題
使用上述方式, 緩存組件需要注意組件的name選項(xiàng)要和路由的name選項(xiàng)一致, 容易疏忽填寫(xiě)組件的name選項(xiàng)問(wèn)題
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Vue使用openlayers實(shí)現(xiàn)繪制圓形和多邊形
這篇文章主要為大家詳細(xì)介紹了Vue如何使用openlayers實(shí)現(xiàn)繪制圓形和多邊形,文中的示例代碼講解詳細(xì),感興趣的小伙伴快跟隨小編一起動(dòng)手嘗試一下2022-06-06手把手帶你安裝vue-cli并創(chuàng)建第一個(gè)vue-cli應(yīng)用程序
vue-cli這個(gè)構(gòu)建工具大大降低了webpack的使用難度,支持熱更新,有webpack-dev-server的支持,相當(dāng)于啟動(dòng)了一個(gè)請(qǐng)求服務(wù)器,給你搭建了一個(gè)測(cè)試環(huán)境,下面這篇文章主要給大家介紹了關(guān)于安裝vue-cli并創(chuàng)建第一個(gè)vue-cli應(yīng)用程序的相關(guān)資料,需要的朋友可以參考下2022-08-08vue實(shí)現(xiàn)新聞?wù)故卷?yè)的步驟詳解
最近小編遇到這樣的需求,要實(shí)現(xiàn)一個(gè)新聞?wù)故卷?yè)功能,剛接到這樣的需求還真是一頭霧水,不知從哪入手,今天小編通過(guò)實(shí)例代碼給大家介紹下vue實(shí)現(xiàn)新聞?wù)故卷?yè)的步驟詳解,感興趣的朋友跟隨小編一起看看吧2019-04-04vite.config.ts配置之自動(dòng)導(dǎo)入element-puls方式
這篇文章主要介紹了vite.config.ts配置之自動(dòng)導(dǎo)入element-puls方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10利用vue開(kāi)發(fā)一個(gè)所謂的數(shù)獨(dú)方法實(shí)例
數(shù)獨(dú)是源自18世紀(jì)瑞士的一種數(shù)學(xué)游戲,是一種運(yùn)用紙、筆進(jìn)行演算的邏輯游戲。下面這篇文章主要給大家介紹了關(guān)于利用vue開(kāi)發(fā)一個(gè)所謂的數(shù)獨(dú)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。2017-12-12vux-scroller實(shí)現(xiàn)移動(dòng)端上拉加載功能過(guò)程解析
這篇文章主要介紹了vux-scroller實(shí)現(xiàn)移動(dòng)端上拉加載功能過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10Vue項(xiàng)目啟動(dòng)報(bào)錯(cuò)解決方法大全
這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目啟動(dòng)報(bào)錯(cuò)解決方法的相關(guān)資料,文中通過(guò)圖文將解決的過(guò)程介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用vue具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07vue實(shí)現(xiàn)登陸登出的實(shí)現(xiàn)示例
本篇文章主要介紹了vue實(shí)現(xiàn)登陸登出的實(shí)現(xiàn)示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09