You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>

解决方案

问题根源在于多层事件传递的逻辑漏洞,以及不必要的事件绑定位置错误,以下是具体修复步骤:

  1. 简化路由跳转逻辑,去掉冗余事件传递
    你现在通过子组件→MainPage→App.vue的三层事件传递来触发路由跳转,环节越多越容易出问题。直接在MainPage里处理路由跳转即可:
    修改MainPage.vue的onClickNext1方法:

    onClickNext1() {
      this.$router.push("/first");
    }
    

    同时删除App.vue中router-view上的@clickedNext1="onClickTransition"绑定,以及App.vue里的onClickTransition方法——完全不需要把事件传到App.vue处理。

  2. 确认过渡动画的正确性
    你的transition配置(绑定$route.fullPath作为key、mode="out-in")是正确的,只要路由正常切换,动画就能触发。之前刷新后动画正常,说明动画本身没有问题,只是路由切换时组件没正确渲染。

  3. 检查FirstScene组件的模板完整性
    确保FirstScene.vue有完整的模板结构,比如:

    <template>
      <div>
        First Scene 页面内容
      </div>
    </template>
    

    如果组件模板为空,也会出现跳转后空白的情况,刷新后浏览器重新解析才会显示。

  4. 排查beforeunload事件的隐性干扰
    你在App.vue中添加的beforeunload监听虽然不是直接原因,但可以暂时移除测试:
    删除mounted、beforeUnmount中的监听代码,以及leave方法,确认是否有隐性影响。

按上述步骤调整后,路由跳转时FirstScene组件会正常渲染,过渡动画也能正常执行。


内容的提问来源于stack exchange,提问作者Young Aude Leigh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 22:16:17