我新增了一條新路線,並新增了過渡到新路線的動畫。
我新增了以下程式碼,當我點擊按鈕時,程式碼會推送新路由(/first):
/* From the Template */ <router-view @clickedNext1="onClickTransition" v-slot="{ Component }"> <transition name="route1" mode="out-in"> <component :is="Component"></component> </transition> </router-view> /* From the Script */ methods: { onClickTransition() { this.$router.push("/first"); },
現在的問題是,當我點擊按鈕並呼叫「onClickTransition」方法時,路由器似乎被推送得很好,但頁面是空的。只有當我透過按 ctrl R 手動刷新頁面時才會呈現元件。
我相信問題可能來自動畫的插入,但如果我手動刷新頁面,動畫效果就很好。所以我不知道問題是什麼。我將非常感謝您的幫助。
這是 app.vue 的其餘程式碼:
<template> <router-view @clickedNext1="onClickTransition" v-slot="{ Component }"> <transition :key="$route.fullPath" name="route1" mode="out-in"> <component :is="Component" /> </transition> </router-view> </template> <script> export default { name: "App", components: {}, data() { return {}; }, methods: { onClickTransition() { this.$router.push("/first"); }, leave(event) { event.preventDefault(); event.returnValue = ""; }, }, mounted() { window.addEventListener("beforeunload", this.leave); }, beforeUnmount() { window.removeEventListener("beforeunload", this.leave); }, }; </script> <style> #app { font-family: Avenir, Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; text-align: center; color: #fff; background-color: #151515; position: relative; } * { margin: 0; padding: 0; box-sizing: border-box; } body { margin: 0px; } /* route transition */ .route1-enter-from { opacity: 0; } .route1-enter-active { transition: all 3s ease-in; } .route1-leave-to { opacity: 0; } .route1-leave-active { transition: all 3s ease-in; } </style>
index.js 中的程式碼部分:
import { createRouter, createWebHistory } from "vue-router"; import MainPage from "../views/MainPage.vue"; import FirstScene from "../views/FirstScene.vue"; const routes = [ { path: "/", name: "main", component: MainPage, }, { path: "/first", name: "first", component: FirstScene, }, ]; const router = createRouter({ history: createWebHistory(process.env.BASE_URL), routes, }); export default router;
「onClickTransition」方法來自「PreStartPage.vue」元件,該元件是主路由「MainPage.vue」的子元件。
一旦在「PreStartPage.vue」中按一下「Next」按鈕,它就會使用this.$emit."MainPage.vue" 向「MainPage.vue」發送事件,然後使用名為「的方法接收該事件” onClickNext1”,它透過另一個this.$emit 向“App.vue”發送信號。這就是App.vue 中顯示的“@clickedNext1”的來源。
以下是「PreStartPage.vue」中的程式碼:
<script> export default { name: "PreStartPage", methods: { onClickNext() { this.$emit("clickedNext"); }, }, }; </script>
這是來自「MainPage.vue」的程式碼:
<script> import PreStartPage from "../components/PreStartPage.vue"; export default { name: "MainPage", components: { PreStartPage }, data() { return { showMain: true, showPre: false }; }, methods: { toggleMain() { this.showMain = !this.showMain; this.showPre = !this.showPre; }, onClickNext1() { this.$emit("clickedNext1"); }, }, }; </script>
嘗試像這樣修改您的程式碼:
設定為 $route.fullPath 的「key」屬性應確保每當路由變更時都能正確完成轉換。
編輯
要解決這個問題,您可以為過渡元件添加“:enter-active-class”和“:leave-active-class”屬性,這允許您指定在過渡期間應應用於元素的類別過渡。
在 App.vue 元件中,您可以像這樣更新轉換元件:
這將確保在轉換期間將正確的類別應用於元素,並確保元件在動畫開始之前完全呈現。
有關更多信息,我應該您訪問官方維基:https://vuejs.org/guide/built-ins/transition.html#css-based-transitions