Я делаю боковую панель в Nuxt 3 и разделил боковую панель на два компонента, а именно боковую панель и гамбургер.
Я не понимаю, почему Transition в компоненте Nuxt 3 не работает?
Я также использую useState() composable для совместного использования состояния в этих двух компонентах, пожалуйста, посмотрите на мой код ниже:
useStates.ts
export const isNavOpen = useState<Boolean>('isNavOpen', () => false);
Гамбургер.vue
<template>
<div id = "hamburger" :class = "{ 'active': hamburger }" @click.prevent = "toggle">
<a v-ripple class = "cursor-pointer block align-self-center">
<i class = "pi pi-bars text-xl"></i>
</a>
</div>
</template>
<script setup lang = "ts">
const hamburger = useState('isNavOpen');
const toggle = () => {
hamburger.value = !hamburger.value;
}
</script>
Боковая панель.vue
<template>
<div class = "sidebar">
<div class = "sidebar-backdrop" @click.prevent = "toggle" v-if = "sidebar">
<Transition name = "slide">
<div v-if = "sidebar"
class = "sidebar-panel">
<slot></slot>
</div>
</Transition>
</div>
</div>
</template>
<script setup lang = "ts">
const sidebar = useState('isNavOpen');
const toggle = () => {
sidebar.value = !sidebar.value;
}
</script>
<style scoped>
.slide-enter-active,
.slide-leave-active
{
transition: transform 0.2s ease;
}
.slide-enter,
.slide-leave-to {
transform: translateX(-100%);
transition: all 150ms ease-in 0s
}
.sidebar-backdrop {
background-color: rgba(0,0,0,.5);
width: 100vw;
height: 100vh;
position: fixed;
top: 0;
left: 0;
cursor: pointer;
}
.sidebar-panel {
overflow-y: auto;
background-color: #130f40;
position: fixed;
left: 0;
top: 0;
height: 100vh;
z-index: 999;
padding: 3rem 20px 2rem 20px;
width: 300px;
}
</style>
Я думал, что переход должен работать в компоненте Nuxt 3, сообщите, пожалуйста, что я упустил? Заранее благодарю!
Спасибо, что прочитали мой вопрос. Я отредактировал свой вопрос. Я ценю, если вы можете помочь.





Не используйте одну и ту же переменную в v-if снаружи и внутри компонента перехода. Когда Ваш компонент <Transition> появляется в шаблоне, в реальности у него нет v-if. Компонент есть как всегда, так что ему нечего переходить, v-if внутри перехода не существует в реальности. Поэтому, чтобы решить эту проблему, просто удалите v-if из внешнего div вокруг переходного компонента. Или поместите его внутри компонента перехода.
Я нашел свое решение.
Во-первых, useState должен быть записан так:
export const useNavOpen = () => useState<boolean>('navOpen', () => false)
Во-вторых, не переносите sidebar-backdrop на Transition, реальный код должен выглядеть так:
<template>
<div class = "sidebar">
<div class = "sidebar-backdrop" @click.prevent = "toggle" v-if = "sidebar"></div>
<Transition name = "slide">
<div v-if = "sidebar" class = "sidebar-panel">
<slot></slot>
</div>
</Transition>
</div>
</template>
В-третьих, я использовал slide-enter, должно быть slide-enter-from, реальный код выглядит так:
.slide-enter-active,
.slide-leave-active
{
transition: transform 0.2s ease;
}
.slide-enter-from,
.slide-leave-to {
transform: translateX(-100%);
transition: all 150ms ease-in 0s
}
Прошлый код в тексте, нет в картинках!!!