我添加了一条新路线,并添加了过渡到新路线的动画。
我添加了以下代码,当单击按钮时,该代码会推送新路由(/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