Gridsome is mounting & unmounting the whole layout on route change. This happens because of how Gridsome deals with Layouts. Layouts are just wrapper components per page. This means, by default, it's only possible to have Enter transitions.
✌️ If you want to keep, for example, Header and Footer between page transitions you'll need to override App.vue and add a transition there.
To make transitions work now you need to use only Enter transitions. You can do this by adding a appear
attribute to <transition>
.
Here is an example where we fade in content on route change in a layout:
<template>
<div id="main-wrapper">
<header />
<transition name="fade" appear>
<main> <!-- a wrapper for slot is needed -->
<slot /> <!-- the content -->
</main>
</transition>
<footer />
</div>
</template>
<style>
.fade-enter-active {
transition: opacity .5s;
}
.fade-enter {
opacity: 0;
}
</style>