我添加了一条新路线,并添加了过渡到新路线的动画。
我添加了以下代码,当单击按钮时,该代码会推送新路由(/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> Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
尝试像这样修改您的代码:
设置为 $route.fullPath 的“key”属性应确保每当路由更改时都能正确完成转换。
编辑
要解决这个问题,您可以向过渡组件添加“:enter-active-class”和“:leave-active-class”属性,这允许您指定在过渡期间应应用于元素的类过渡。
在 App.vue 组件中,您可以像这样更新转换组件:
这将确保在转换期间将正确的类应用于元素,并确保组件在动画开始之前完全呈现。
有关更多信息,我应该您访问官方维基:https://vuejs.org/guide/built-ins/transition.html#css-based-transitions