Vue, как создать компонент без шаблона?

Нужен следующий функционал, после авторизации пользователя он возвращается обратно в приложение по ссылке с callback-функцией - localhost/callback, в этот момент мне не нужно ничего рендерить, приложение парсит информацию в строке поиска и роутер толкает на страницу пользователя, но vue ругается что нет шаблона для рендеринга, как правильно реализовать этот функционал?

мой код обратного вызова:

import { useRoute, useRouter } from 'vue-router';
import { useUserStore } from '../../../stores/userState'

export default {
    name: 'AuthCallback',
    setup() {
        const tokenParseRegex: RegExp = /access_token=(.*?)&/;
        const idParseRegex: RegExp = /user_id=(.*?)$/;
        const exAccessToken: RegExpMatchArray | null = useRoute().hash.match(tokenParseRegex);
        const exUserId: RegExpMatchArray | null = useRoute().hash.match(idParseRegex);
        if (exAccessToken !== null) {
            useUserStore().userAccess.accessToken = exAccessToken![1];
            useUserStore().userAccess.userId = exUserId![1];
            useUserStore().userAccess.isAuthorized = true;
            localStorage.setItem('userAccess', JSON.stringify(useUserStore().userAccess))
        } else {
            useRouter().push({
                name: 'AuthFailed',
            })
        }
        if (exUserId) {
            useRouter().push({
                name: 'UserInit',
                params: { usedId: String(exUserId![1]) },
            })
        } else {
            useRouter().push({
                name: 'AuthFailed',
            })
        }
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете реализовать свою логику в роутере навигации:

{
  path: '/callback',
  component: {},
  beforeEnter: (to, from, next) => {
    const isSuccessfulAuth = checkSomething()

    if (isSuccessfulAuth) {
      next({
        name: 'UserInit',
      })
    } else {
      next({
        name: 'AuthFailed',
      })
    }
}

Обновлено: я только что вспомнил лучший способ (если ваша логика синхронна). Вы можете создать маршрут перенаправления

{
  path: '/callback',
  redirect: () => {
    const isSuccessfulAuth = checkSomething()

    if (isSuccessfulAuth) {
      return {
        name: 'UserInit',
      }
    } else {
      return {
        name: 'AuthFailed',
      }
    }
}

при попытке использовать оба метода, получая эту ошибку Не удается прочитать свойства неопределенного (чтение «хэш») В этом - const exAccessToken: RegExpMatchArray | null = useRoute().hash.match(tokenParseRegex); Как это исправить?

Mirikkingg 29.10.2022 16:49

Чтобы получить объект маршрута, используйте первый параметр beforeEach() или redirect() вместо useRoute(). redirect: (route) => { route.hash.match... } или beforeEach: (to, from, next) => { to.hash.match... }

Romalex 29.10.2022 17:06

Ага, все работает, спасибо!

Mirikkingg 29.10.2022 18:01

Для компонента должен быть определен либо шаблон, либо функция рендеринга. С учетом сказанного вы можете взглянуть на компоненты без рендеринга или компонуемые.

Однако я думаю, что было бы проще поместить эту логику в решение для управления состоянием, такое как pinia, где вы можете обрабатывать все, что связано с аутентификацией, и вызывать его из компонента приложения или страницы «Обратный вызов» при его монтировании.

Редактировать:

Вы также можете комбинировать его с раствором @Romalex. То есть использовать магазин в навигационной охране.

{
    path: '/callback',
    component: {},
    beforeEnter: (to, from, next) => {
        const authStore = useAuthStore();

        authStore.checkToken(...); // use extracted parts from regexes
        
        if (isSuccessfulAuth) {
            next({
                name: 'UserInit',
            })
        } else {
            next({
                name: 'AuthFailed'
            })
        }
    }
}

Другие вопросы по теме