Насколько я могу судить, то, что я делаю, должно работать правильно, основываясь на нескольких примерах, которые я нашел в Интернете, и на общем шаблоне, который, как мне кажется, я правильно понял из исходного кода ящика Wave UI.
В основном у меня есть компонент боковой панели, и я хочу, чтобы его можно было скрыть в соответствии с предоставленным ему значением (идея заключается в том, что его можно изменить в соответствии с потребностями родительского компонента, размером экрана, кнопкой переключения и т. Д.). Таким образом, компонент боковой панели имеет функцию наблюдения, которая должна реагировать на изменения в props.value.
Sidebar.vue
<template>
<aside v-if="mountSidebar" class="min-h-screen">
<slot></slot>
</aside>
</template>
<script lang="ts">
import { defineComponent, ref, watch } from "vue";
export default defineComponent({
name: "Sidebar",
props: {
value: {
type: Boolean,
default: true,
},
},
setup(props) {
const mountSidebar = ref(props.value);
watch(
() => props.value,
(value) => {
mountSidebar.value = value;
}
);
return {
close,
mountSidebar,
};
},
});
</script>
И затем App.vue, где в настоящее время отображается боковая панель.
<template>
<div>
<navbar>
<dm-button rounded type="primary" @click="showSidebar = !showSidebar">Toggle Sidebar</dm-button>
Navbar Content
</navbar>
<div class="flex flex-row min-h-screen bg-gray-100 text-gray-800">
<sidebar v-model="showSidebar">
Sidebar Content
</sidebar>
<div class="flex justify-center w-full">
<router-view />
</div>
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, ref } from "vue";
import Navbar from "@/components/Navbar.vue";
import Sidebar from "@/components/Sidebar.vue";
import DmButton from "@/components/Button.vue";
export default defineComponent({
components: {
Navbar,
Sidebar,
DmButton,
},
setup() {
const showSidebar = ref(true);
return {
showSidebar,
};
},
});
</script>
В моем App.vue есть showSidebar
логическая ссылка, которая предоставляется как v-model
в компоненте боковой панели. Существует также dm-button (расширенный компонент кнопки, который я написал), который переключает значение showSidebar при нажатии (я знаю, что это работает, я вижу изменение значения showSidebar
в компоненте App.vue в Vue Devtools). Однако это изменение не отражено в компоненте боковой панели. Я не уверен, что мне здесь не хватает.
К вашему сведению, этот код упрощен, чтобы удалить некоторые ненужные вещи (например, содержимое боковой панели и навигационных панелей).