Задать вопрос
Ответы пользователя по тегу Nuxt.js
  • Как заставить hmr в vite подключатсья по wss?

    @null_object
    Как уже написал Aetae, конфигурацией протокола занимается nuxt, но монкипатчить не обязательно, переопределить конфиг можно через хук, например так
    export default defineNuxtConfig({
      hooks: {
        'vite:extendConfig': function (vite) {
          vite.server.hmr = {
            protocol: 'wss',
          };
        },
      },
    });
    Ответ написан
    Комментировать
  • Как правильно отобразить компоненты в Components Tree Nuxt 3?

    @null_object
    Это стандартное поведение компонента <NuxtPage /> и не является проблемой, он внутри себя использует <RouterView /> из vue-router в который добавляется внутренняя логика Nuxt (например добавление Transitions если они указаны в настройках). Anonymous Component на самом деле - компонент RouteProvider, который занимается перерисовкой страниц. В общем, просто обертка фреймворка для роутинга.

    RouteProvider добавляется тут. Код самого провайдера можно тут посмотреть.
    Ответ написан
    Комментировать
  • Как работает runtime config в Nuxt 3?

    @null_object
    Под рантайм конфигурацией понимаются переменные окружения, которые может подхватить приложение после сборки. Если собрать обычное SPA, значения этих переменных зашиваются на этапе сборки прямо в код и их поменять можно только повторной пересборкой.

    То, что вы в консоли установили переменную окружения и она сразу попала в приложения - скорее всего совпадение. Девопсы правильно сказали про их статичность, так что по какой-то причине у вас сработал hmr и подхватились новые переменные.

    Найти конкретную причину всех возможных триггеров для перезагрузки в коде будет достаточно затруднительно, т.к. эта логика сильно размазана по пакетам Nuxt -> Nitro -> Vite -> Chokidar
    Ответ написан
    Комментировать
  • Как использовать хуки NUXT в модулях?

    @null_object
    Если нужны именно хуки
    const nuxtApp = useNuxtApp();
    
    const loadingStartHook = nuxtApp.hook('page:loading:start', () => {
      ...
    });
    
    const loadingFinishHook = nuxtApp.hook('page:loading:end', () => {
      ...
    });
    
    const unsubError = nuxtApp.hook('vue:error', () => ...)


    В какой-то из версий добавили встроенный композабл useLoadingIndicator . Это удобная обертка над этими хуками, можно в исходниках глянуть.

    Использовать достаточно просто
    const { progress, isLoading } = useLoadingIndicator();


    Тут можно посмотреть пример кастомного индикатора
    Ответ написан
    Комментировать
  • Nuxt Supabase Как решить ошибку 500 "client.from is not a function"?

    @null_object
    serverSupabaseClient возвращает Promise, нужно добавить await

    import { serverSupabaseClient } from '#supabase/server'
    
    export default eventHandler(async (event) => {
        const client = await serverSupabaseClient(event)
        const { data } = await client.from('users').select("*")
        return { users: data }
    })
    Ответ написан
  • Как в Nuxt 3 использовать одну страницу для разных роутов?

    @null_object
    Динамические параметры во vue-router обозначаются через :

    export default defineNuxtConfig({
      hooks: {
        "pages:extend"(pages) {
          pages.push({
            name: "cities-id",
            path: "/cities/:id",
            file: "~/pages/cities.vue",
          });
        },
      },
    });

    Пример
    Ответ написан
    1 комментарий
  • Как правильно настроить refetch watch?

    @null_object
    <script setup lang="ts">
    import ModalDesktop from "~/components/modals/ModalDesktop.vue";
    
    interface Book {
      title: string;
      published_year: number;
      description: string;
      book_series: string;
      genre: string;
      authors: string;
      tag_id: string;
      id: string;
    }
    
    const token =
      "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwY2Y5Nzk0Yi1jYjczLTR";
    
    const { data: books, refresh } = await useFetch<{ results: Book[] }>(
      "https://api.storage",
    );
    
    const { apiErrorHandler } = useErrorService();
    
    const selectedBook = ref<Book | null>(null);
    const showDeleteModal = ref(false);
    
    const modalVisible = computed(
      () => selectedBook.value !== null || showDeleteModal.value,
    );
    
    const openModal = (book: Book) => {
      selectedBook.value = book;
    };
    
    const closeModal = () => {
      selectedBook.value = null;
      showDeleteModal.value = false;
    };
    
    const deleteBook = async (book: Book) => {
      const { error } = await useFetch(`https://api.storage/${book.id}`, {
        method: "DELETE",
        headers: {
          Authorization: `Bearer ${token}`,
        },
      });
    
      if (error.value) {
        apiErrorHandler(error.value);
      } else {
        showDeleteModal.value = true;
        selectedBook.value = null;
      }
    };
    </script>


    <ModalDesktop v-if="modalVisible" @close="closeModal">
        <div class="px-space-s">
          <div v-if="selectedBook">
            <img
              :src="`https://api.storage/${selectedBook.cover_path}`"
              alt="Cover"
              class="w-[px] h-[100px] bg-center bg-cover"
            />
            <h4>{{ selectedBook.title }}</h4>
            <p><strong>Описание:</strong> {{ selectedBook.description }}</p>
            <p>
              <strong>Год публикации:</strong>
              {{ selectedBook.published_year }}
            </p>
            <p><strong>Серия:</strong> {{ selectedBook.book_series }}</p>
            <p><strong>Жанр:</strong> {{ selectedBook.genre }}</p>
            <p><strong>Автор:</strong> {{ selectedBook.authors }}</p>
            <p><strong>Тег:</strong> {{ selectedBook.tag_id }}</p>
            <p><strong>Id книги:</strong> {{ selectedBook.id }}</p>
          </div>
          <div v-if="showDeleteModal">
            <p>Книга успешно удалена!</p>
          </div>
          <div class="flex gap-x-space-s mt-space-s ml-auto">
            <button
              v-if="selectedBook"
              class="bg-blue-500 text-white p-space-xs pl-space-m pr-space-m rounded-medium hover:bg-blue-600"
              @click="deleteBook(selectedBook)"
            >
              Удалить
            </button>
          </div>
        </div>
      </ModalDesktop>
    Ответ написан
  • Отображение рендеринг динамических компонентов на странице Vue3 Nuxt?

    @null_object
    Нужно явно импортировать ваши компоненты, так
    import {
      AddBookForm,
      AddTagsForm,
      AddAuthorsForm,
      AddSeriesForm,
      AddFilesForm
      AddFoldersForm,
    } from '#components'


    Либо использовать утилиту vue resolveComponent
    const buttons = [
      { formName: resolveComponent('AddBookForm'), label: 'Добавить книгу' },
      { formName: resolveComponent('AddTagsForm'), label: 'Добавить ТЕГ' },
      { formName: resolveComponent('AddAuthorsForm'), label: 'Добавить Автора' },
      { formName: resolveComponent('AddSeriesForm'), label: 'Добавить Серию' },
      { formName: resolveComponent('AddFilesForm'), label: 'Добавить Файл' },
      { formName: resolveComponent('AddFoldersForm'), label: 'Добавить Папку' },
    ];


    Из документации: https://nuxt.com/docs/guide/directory-structure/co...
    Ответ написан