Перейти к содержанию

Макет

layouts/Default.vue
<script setup>
import { onMounted, ref, watch } from "vue";
import { fetchWrapper } from "@/helpers";
import { Title, Footer, View } from "@/components";

const baseUrl = `${import.meta.env.VITE_API_URL}`;

const props = defineProps({
  showTitle: Boolean,
  showGroupName: Boolean,
  showLogout: Boolean,
});

const groupName = ref("")

const fetchData = async () => {
  if (props.showGroupName && props.showTitle) {
    try {
      const data = await fetchWrapper.get(`${baseUrl}/oidc/group/`);
      if (data) {
        groupName.value = data.group;
      }
    } catch (err) {
      console.error(err);
    }
  }
};

onMounted(fetchData);

watch(() => props.showGroupName, fetchData);
</script>

<template>
  <v-app style="background-color: #64B5FF">
    <Title :group-name="groupName" :show-title="showTitle" :show-logout="showLogout" :show-group-name="showGroupName"/>
    <View />
    <Footer />
  </v-app>
</template>

<style scoped>

</style>

Этот компонент является "корневым", то есть у него отсутствуют родители. Значения для своих props он будет получать напрямую из роутера.

В этом компоненте объединяются компоненты Title, View (отображающий компоненты, переданные в роутер) и Footer.

На вход этот компонент принимает всё те же три пропа, указанные в компоненте Title, чтобы получить их из роутера и передать в хедер.

Как только этот компонент монтируется, он проверяет необходимость выводить заголовок и номер группы пользователя, ориентируясь на значения переменных showTitle и showGroupName.

Если такая необходимость есть, отправляет запрос на бэкенд, чтобы получить номер группы, и сохраняет его в реактивную переменную, которую вместе с пропами передаёт в компонент Title.