Nano Hash - криптовалюты, майнинг, программирование

Vue router: как динамически генерировать заголовки страниц для динамических маршрутов?

У меня есть простой веб-сайт на основе Vue, созданный с помощью Vue CLI, и я пытаюсь понять, как динамически генерировать заголовки страниц для представлений с динамическими маршрутами. Сайт извлекает данные JSON из автономной CMS, и у меня есть динамические маршруты, настроенные для подробных представлений о типе контента проекта. У меня настроен динамический маршрут следующим образом:

// single project vue (dynamic)
{
    path: "/projects/:project_name_slug",
    name: "single-project",
    component: () =>
        import(
            /* webpackChunkName: "single-project" */ "./views/SingleProject.vue"
        ),
    meta: {
        title: "project detail",
    }
}

Я добавил следующее, что работает для добавления заголовков статических страниц:

// show page titles
const DEFAULT_TITLE = "my blog";
router.afterEach((to, from) => {
    // document.title = to.meta.title || DEFAULT_TITLE;
    document.title = "my blog - " + to.meta.title || DEFAULT_TITLE;
});

В его нынешнем виде, при посещении детального просмотра проекта, заголовок будет читать мой блог - детали проекта; однако я бы хотел, чтобы фактическое имя проекта было извлечено из данных JSON / поля для project_name (так же, как путь маршрута использует project_name_slug), но ничего из того, что я пробовал до сих пор, не сработало. Например, использование meta: { title: (route) => route.params.project_name } приводит к тому, что после моего блога отображается необработанный текст функции -. Таким образом, в случаях для этих динамических представлений я хотел бы to.meta.title разрешить имя проекта, создав мой блог - {название проекта}. Благодарим вас за любую помощь и дайте мне знать, если мне понадобится дополнительная информация.

* Примечание. Этот вопрос отличается от вопроса, заданного в этой теме SO поскольку в моем случае используются динамические маршруты с использованием данных JSON, запрошенных через Axios


  • Отвечает ли это на ваш вопрос? Как динамически управлять заголовками страниц в Vuejs? 19.02.2021
  • @KeithNicholas - в этой ссылке используется статическая мета, этот вопрос касается динамической меты (заголовок в связанном вопросе является динамическим, а мета - нет) 19.02.2021
  • Доступны ли ваши данные JSON до событий жизненного цикла компонента или вы получаете их из запроса axios после создания компонента? 19.02.2021
  • @Ohgodwhy я получаю данные из запроса axios 19.02.2021
  • @KeithNicholas Это был один из первых постов, которые я просмотрел, но, похоже, не работает в моем случае с динамическими маршрутами. 19.02.2021

Ответы:



2

Я предполагаю, что вы спрашиваете, как это сделать до инициализации компонента, потому что у вас есть проблемы с SEO, иначе это было бы так же просто, как извлечь его из ответа JSON в вашем запросе axios и использовать document.title = myJson.page_title в компоненте.

Если вашей конечной целью является устранение этого страха из-за проблем с SEO (что совершенно верно), вам необходимо изменить свой подход, чтобы сделать данные JSON доступными до того, как компонент даже будет отрисован.

Я бы посоветовал сделать запрос axios в вашем устройстве навигации по маршруту и ​​заблаговременно увлажнить свойство маршрута, чтобы у вас действительно был доступ к заголовку страницы. Наблюдать:

Обновите свой маршрут, чтобы принять новое метасвойство:

meta: {
  title: "project detail",
  content: []
}

Импортируйте axios в файл, в котором находится ваш навигатор, и выполните запрос axios для извлечения и гидратации content. Вместо этого перейдите с afterEach на beforeEach, чтобы можно было заблокировать рендеринг компонента до тех пор, пока не будут получены ваши данные:

import axios from 'axios'

router.beforeEach(async(to, from, next) => {
  const { response } = await axios.get(`/my/cms/endpoint/${to.params.project_name_slug}`)

  document.title = `my blog - ${response.data.title}`

  to.meta.content = response.data.content

  next()
})

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

Теперь в вашем компоненте вы сможете получить доступ к this.$route.meta.content, и вы можете использовать это в жизненном цикле mounted для гидратации локального свойства или использовать геттер для его возврата, что, как я полагаю, вы уже делаете что-то подобное:

export default {
  get pageContent () {
    return this.$route.meta.content
  }
}
19.02.2021
  • Спасибо @ohgodwhy, я понимаю, что это как раз проблема, то есть необходимость сделать данные JSON доступными до того, как компонент будет отрисован (в противном случае установка заголовка через ответ JSON в самом компоненте SingleProject приведет к задержке заголовка отображение, которое меня отвлекает - и проблемы с SEO даже не приходили мне в голову, но это хороший момент!) Я попробую ваше решение - спасибо. 19.02.2021
  • Имейте в виду, что это не гарантирует, что поисковые роботы увидят этот заголовок, поскольку он установлен JavaScript. (Я тоже не отвечаю.) Обычно сайты используют схему предварительного рендеринга, такую ​​как SSR, для работы с SEO. Это одна из основных причин использования Nuxt. Тем не менее, хороший ответ и подходит для случаев, когда требуется выборка. 19.02.2021

  • 3

    Это устарело, но на случай, если это кому-то поможет, у меня только что возникла эта проблема, и я нашел комбинацию с использованием router.afterEach для статических заголовков, работавших в сочетании с миксином для динамических заголовков.

    В случае, объясненном OP, я бы удалил опору заголовка с любых динамических страниц в маршрутизаторе и в afterEach, просто проверьте наличие meta.title

    router.afterEach(to => {
      if (to.meta.title) {
        document.title = `${to.meta.title} - my blog`;
      }
    });
    

    Затем создайте простой миксин для других страниц, например:

    export default {
      methods: {
        setTitle(str) {
            document.title = `${str} - my blog`
        }
      }
    }
    

    Затем на этих динамических страницах вы просто вызываете this.setTitle () с любыми динамическими данными после их загрузки с сервера. Я знаю, что это кажется слишком простым, но это работает. У меня были проблемы со всеми методами beforeEach, которые вы найдете на SO.

    Примечание: это не для поисковых роботов или поисковых роботов (для которых я рекомендую prerenderSpa), но дает вам красивые заголовки, историю кнопок назад и закладки.

    10.07.2021
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

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