Использую nuxt 3 + pinia, упрощенный пример того чего хотелось бы: на сайте имеется шапка, подключенная в layouts/default.vue, все отлично - она отображается на каждой странице.
Обобщенно можно сформулировать следующую задачу - на главной странице шапка должна быть absolute (чтобы под ней был виден приветственный баннер), на других страницах, она должна быть relative.
Создал pinia-хранилище useHeaderStore в котором есть свойство isAbsolute и метод setAbsolute. Каждая страница может дернуть setAbsolute, который изменит состояние absolute и к шапке применяется соответствующее css-свойство. В целом это работает, НО: nuxt на сервере сначала рендерит шапку, потом страницу, которая должно меняет состояние шапки. Получается что пользователь получает html c шапкой, имеющей начальное значение absolute, а не то, которое установила страница в ходе рендеринга на сервере.
Как страница может настроить общее состояние приложения и чтоб все работало, даже если выключить JS в браузере? Накидайте идей, буду благодарен)
export const useHeaderStore = defineStore('header', () => {
const isAbsolute = ref(false)
const setAbsolute = (value: boolean) => isAbsolute.value = value
return { isAbsolute, setAbsolute }
})
<template>
<header :class="{ 'is-absolute': isAbsolute }"></header>
</template>
<script setup lang="ts">
import { useHeaderStore } from '~/stores/header'
const store = useHeaderStore()
const isAbsolute = store.isAbsolute
</script>
<template>
<h1>Главная страница</h1>
</template>
<script setup lang="ts">
import { useHeaderStore } from '~/stores/header'
const { setAbsolute } = useHeaderStore()
setAbsolute(true)
</script>