vue頁(yè)面切換項(xiàng)目實(shí)現(xiàn)轉(zhuǎn)場(chǎng)動(dòng)畫的方法
前言
移動(dòng)端, 使用vue為了良好的用戶體驗(yàn), 會(huì)需要實(shí)現(xiàn)APP形式的切換頁(yè)面的左滑和右滑效果
實(shí)現(xiàn)原理, vue的過(guò)渡 & 動(dòng)畫
技術(shù)棧: vue + vue-router
解決思路
區(qū)分前進(jìn) 和 后退的路由
網(wǎng)上搜索的資料, 找到了兩種
監(jiān)聽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)畫效果(通過(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)畫還是后退動(dòng)畫
}
},
{
path: "/forward",
name: "Forward",
component: resolve => require(["@/pages/forward"], resolve),
meta: {
title: "前進(jìn)",
keepAlive: true,
index: 2
}
},
在App.vue(根組件)中, 判斷動(dòng)畫方向
<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)畫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)畫方向
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)畫名稱
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)題
子路由還沒有考慮到
- 緩存組件問(wèn)題
使用上述方式, 緩存組件需要注意組件的name選項(xiàng)要和路由的name選項(xiàng)一致, 容易疏忽填寫組件的name選項(xiàng)問(wèn)題
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
vuex + axios 做登錄驗(yàn)證 并且保存登錄狀態(tài)的實(shí)例
今天小編就為大家分享一篇vuex + axios 做登錄驗(yàn)證 并且保存登錄狀態(tài)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09
Vuex實(shí)現(xiàn)數(shù)據(jù)增加和刪除功能
今天小編就為大家分享一篇Vuex實(shí)現(xiàn)數(shù)據(jù)增加和刪除功能,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11
前端vue中實(shí)現(xiàn)嵌入代碼編輯器的詳細(xì)代碼
隨著Web技術(shù)的不斷發(fā)展,前端開發(fā)也正日新月異,下面這篇文章主要給大家介紹了關(guān)于前端vue中實(shí)現(xiàn)嵌入代碼編輯器的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07
基于vue3實(shí)現(xiàn)一個(gè)抽獎(jiǎng)小項(xiàng)目
在公司年會(huì)期間我做了個(gè)抽獎(jiǎng)小項(xiàng)目,非常棒,今天把他分享到腳本之家平臺(tái),供大家學(xué)習(xí)參考,對(duì)vue3實(shí)現(xiàn)抽獎(jiǎng)小項(xiàng)目感興趣的朋友一起看看吧2023-01-01
Vuex Store 數(shù)據(jù)在頁(yè)面刷新后丟失的解決方法
當(dāng)我們使用 Vue.js 和 Vuex 進(jìn)行狀態(tài)管理時(shí),一個(gè)常見的問(wèn)題是頁(yè)面刷新會(huì)導(dǎo)致 Vuex store 中的數(shù)據(jù)丟失,本文將詳細(xì)介紹解決 Vuex Store 數(shù)據(jù)在頁(yè)面刷新后丟失的方法,感興趣的朋友一起看看吧2024-08-08
vue的Virtual Dom實(shí)現(xiàn)snabbdom解密
這篇文章主要介紹了vue的Virtual Dom實(shí)現(xiàn)- snabbdom解密,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
利用Vue實(shí)現(xiàn)一個(gè)markdown編輯器實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于如何利用Vue實(shí)現(xiàn)一個(gè)markdown編輯器的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Vue具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05

