How to not have nested layout/pages refresh when the main layout changes

I have the following code:
<NuxtLayout :name="mobile ? 'mobile' : 'default'"
<NuxtPage/>
</NuxtLayout>
<NuxtLayout :name="mobile ? 'mobile' : 'default'"
<NuxtPage/>
</NuxtLayout>
So when I change the mobile to be true/false, the layout changes and the page refreshes. Is there a way to make it so that it doesn't refresh?
9 Replies
kapa.ai
kapa.ai3w ago
Hi @NepaliJesus. I'm kapa.ai, your friendly support bot. I will try to answer your question by searching through the knowledge base. :wave: ---------------------- To address your question about preventing nested layout/pages from refreshing when the main layout changes, we can use the keepalive property on the <NuxtPage> component. This approach can help maintain the state of the nested pages when switching between layouts. Here's how you can modify your code:
<NuxtLayout :name="mobile ? 'mobile' : 'default'">
<NuxtPage keepalive />
</NuxtLayout>
<NuxtLayout :name="mobile ? 'mobile' : 'default'">
<NuxtPage keepalive />
</NuxtLayout>
By adding the keepalive attribute to <NuxtPage>, you're telling Nuxt to preserve the component instance when switching between different layouts. This should prevent the page from refreshing when the layout changes. However, it's important to note that there have been some issues reported with the keepalive functionality in certain Nuxt versions. If you encounter any problems, you might want to consider the following alternatives: 1. Use a global keepalive setting in your nuxt.config.ts:
export default defineNuxtConfig({
app: {
keepalive: true
}
})
export default defineNuxtConfig({
app: {
keepalive: true
}
})
2. If you need more fine-grained control, you can set keepalive for specific pages using definePageMeta:
<script setup>
definePageMeta({
keepalive: true
})
</script>
<script setup>
definePageMeta({
keepalive: true
})
</script>
These approaches are based on information from the Nuxt documentation on transitions (https://nuxt.com/docs/getting-started/transitions#disable-transitions) and a GitHub issue discussion (https://github.com/nuxt/nuxt/issues/30221). If you're still experiencing issues with page refreshes, it might be worth checking your Nuxt version and considering an upgrade, as some related bugs have been fixed in recent releases. Nuxt Transitions Documentation (https://nuxt.com/docs/getting-started/transitions#disable-transitions) GitHub Issue Discussion (https://github.com/nuxt/nuxt/issues/30221) ---------------------- Note: you can ask me a follow up question by @ mentioning me again :speech_balloon: ----------------------
kapa.ai
kapa.ai3w ago
<@485194454530129930> Kapa.ai is still learning and improving, please let me know how I did by reacting below.
NepaliJesus
NepaliJesusOP3w ago
This doesn't work. When the layout switches between mobile/default, the whole page as well as any other nested layouts I may have reload.
brunomgmateus
brunomgmateus3w ago
Can I ask why changing the layout completely for mobile? Why not just responsive styling? Is this for a specific mobile app or PWA? As far as I know, a layout change will always trigger a refresh, because the layout is very close to the top of the chain, and so any change will trigger a refresh on all children components. Usually, you would want that, to ensure that everything is recalculated according to the new layout. If what you want is just cosmetic change, my advice is to use css media queries for responsive adjustments, or something like TailwindCSS. It's very good nowadays, and you can create responsive styling in a very controllable and effective way.
Yuri
Yuri2w ago
Why do you need change the layout? When the page loads you know the user device. For my project I create the global middleware:
export default defineNuxtRouteMiddleware((to, _from) => {
const { isMobile } = useDevice()

if (isMobile) {
to.meta.layout = 'mobile'
}
else {
to.meta.layout = 'default'
}
})
export default defineNuxtRouteMiddleware((to, _from) => {
const { isMobile } = useDevice()

if (isMobile) {
to.meta.layout = 'mobile'
}
else {
to.meta.layout = 'default'
}
})
It helps me.
NepaliJesus
NepaliJesusOP2w ago
I wanted to create a responsive design for different screen size
Yuri
Yuri2w ago
But why are you worrying about refresh? In the real world the user's screen doesn't change during browsing.
NepaliJesus
NepaliJesusOP2w ago
Fair point Any idea on how I should have specific pages (multiple pages) have both default layout as well as another layout? It refreshes whenever I switch between the pages with different layout
Yuri
Yuri2w ago
Can you give a real example why you need this case?

Did you find this page helpful?