Vue路由跳转后组件不加载,需手动刷新问题求助
我新增了/first路由,并为路由切换添加了过渡动画。点击按钮时通过以下代码跳转路由:
<!-- 模板部分 --> <router-view @clickedNext1="onClickTransition" v-slot="{ Component }"> <transition name="route1" mode="out-in"> <component :is="Component"></component> </transition> </router-view> <!-- 脚本部分 --> 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>
router/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;
事件传递相关组件
- PreStartPage.vue(MainPage子组件)
<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>
解决方案
问题根源在于多层事件传递的逻辑漏洞,以及不必要的事件绑定位置错误,以下是具体修复步骤:
简化路由跳转逻辑,去掉冗余事件传递
你现在通过子组件→MainPage→App.vue的三层事件传递来触发路由跳转,环节越多越容易出问题。直接在MainPage里处理路由跳转即可:
修改MainPage.vue的onClickNext1方法:onClickNext1() { this.$router.push("/first"); }同时删除App.vue中
router-view上的@clickedNext1="onClickTransition"绑定,以及App.vue里的onClickTransition方法——完全不需要把事件传到App.vue处理。确认过渡动画的正确性
你的transition配置(绑定$route.fullPath作为key、mode="out-in")是正确的,只要路由正常切换,动画就能触发。之前刷新后动画正常,说明动画本身没有问题,只是路由切换时组件没正确渲染。检查
FirstScene组件的模板完整性
确保FirstScene.vue有完整的模板结构,比如:<template> <div> First Scene 页面内容 </div> </template>如果组件模板为空,也会出现跳转后空白的情况,刷新后浏览器重新解析才会显示。
排查
beforeunload事件的隐性干扰
你在App.vue中添加的beforeunload监听虽然不是直接原因,但可以暂时移除测试:
删除mounted、beforeUnmount中的监听代码,以及leave方法,确认是否有隐性影响。
按上述步骤调整后,路由跳转时FirstScene组件会正常渲染,过渡动画也能正常执行。
内容的提问来源于stack exchange,提问作者Young Aude Leigh

