搜索

首页  >  问答  >  正文

New Router页面上的组件只有在手动刷新整个页面后才会加载

我添加了一条新路线,并添加了过渡到新路线的动画。

我添加了以下代码,当单击按钮时,该代码会推送新路由(/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>

P粉986937457P粉986937457239 天前387

全部回复(1)我来回复

  • P粉469090753

    P粉4690907532024-03-30 11:24:49

    尝试像这样修改您的代码:

    /* From the Template */
    
     
      
     
    

    设置为 $route.fullPath 的“key”属性应确保每当路由更改时都能正确完成转换。

    编辑

    要解决这个问题,您可以向过渡组件添加“:enter-active-class”和“:leave-active-class”属性,这允许您指定在过渡期间应应用于元素的类过渡。

    在 App.vue 组件中,您可以像这样更新转换组件:

    
      
    

    这将确保在转换期间将正确的类应用于元素,并确保组件在动画开始之前完全呈现。

    有关更多信息,我应该您访问官方维基:https://vuejs.org/guide/built-ins/transition.html#css-based-transitions

    回复
    0
  • 取消回复