Метаполя Vue Router

Мне было интересно, можно ли определить пользовательские свойства при передаче маршрутов в VueRouter. Например, для большинства маршрутов в моем приложении я хотел бы определить маршрут, например следующий, где я могу передать компонент в необязательное свойство «меню»:

{ path: "/section-stack", component: SectionStack, menu: SectionMenu }

Чтение документы указывает на использование для этого метаполя, но это не дает того, чего я хочу, и приводит к более подробным маршрутам. Глядя на код, каждый маршрут, переданный VueRouter, имеет тип RouteConfig. Можно ли изменить мой VueRouter, чтобы ему можно было передавать маршруты другого типа? т.е. типа RouteConfig с дополнительными свойствами.

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
3
0
7 724
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Я думаю, что meta еще впереди. Однажды я создал хлебную крошку с ним. Мой маршрут выглядел так:

  routes: [
    {
      path: '/',
      name: 'home',
      component: require('./routes/Home.vue'),
      meta: {
        history: [],
      },
    },
    {
      path: '/projects',
      name: 'projects',
      component: () => System.import('./routes/Projects.vue'),
      meta: {
        history: ['home'],
      },
    },
    {
      path: '/project/:token',
      name: 'project',
      component: () => System.import('./routes/project/Overview.vue'),
      meta: {
        text: (vue) => vue.projects[vue.$route.params.token] || vue.$route.params.token,
        to: { name: 'project', params: { token: (vue) => vue.$route.params.token } } ,
        history: ['home', 'projects'],
    }
  ]

В моем vue-компоненте я мог получить доступ к метаданным, наблюдая за $route и загружая компонент, перебирая объект $router следующим образом:

export default {
    beforeMount() {
      this.allRoutes = {};
      this.$router.options.routes.forEach(route => {
          if (route.name) {
            let text = (route.meta && route.meta.text) || route.name;
            this.$set(this.allRoutes, route.name, {
                text: text,
                to: (route.meta && route.meta.to) || { name: route.name }
              }
            );
          }
        }
      );
    },
    data() {
      return {
        allRoutes: {},
        currentList: [],
      };
    },
    watch: {
      '$route'(to, from) {
        this.currentList = ((to.meta && to.meta.history).slice(0) || []);
        this.currentList.push(to.name);
      }
    },
  }

В частности, forEach в beforeMount может быть решением для создания меню, например. основан на ролях, определенных в метаобъекте.

Спасибо за ваш ответ. Я проголосовал за вас, но не принял ваш ответ, так как это не то, что я ищу. Еще одна причина, по которой я хотел бы использовать определенное свойство типа Component, заключается в том, что оно будет безопасным для типов, где as meta принимает любой тип.

MJ_Wales 14.03.2019 16:47

Если вы хотите, чтобы meta был типобезопасен в вашем приложении, вы можете определить настраиваемый RouteConfig для конкретного приложения, который определяет определенный тип для ваших полей, которые вы хотите определить в свойстве meta. Например: import { RouteConfig } from 'vue-router' ... export type MyAppRouteConfig = Omit<RouteConfig, 'meta'> & { meta: { property1: string, property2: number, ... } } Недостаток этого вы должны ссылаться на этот тип во всем приложении, а не импортировать RouteConfig из vue-router напрямую. Извините, форматирование испорчено

dill 09.12.2020 17:53

Чтобы дополнить мой комментарий в первом ответе (форматирование не поддерживается в комментариях) и построить ответ Маркуса Мадейи, если вы хотите, чтобы свойство meta было типобезопасным, вы можете определить свой собственный расширяющий тип RouteConfig:

import { RouteConfig } from 'vue-router'
...
export type MyAppRouteConfig = Omit<RouteConfig, 'meta'> & {
  meta: {
    property1: string,
    property2: number,
    ...
  }
}

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