Как правильно вывести заголовок и другие метаданные для каждой страницы, используя Vue 3 и библиотеку vueuse/head?

У вас есть обычный сайт на HTML с двумя страницами: главной и контактной. Вы изучаете Vue3 и уже реализовали подгрузку страниц из файлов при переходе по ссылкам. Теперь вы хотите установить уникальные значения для метатега title и других метатегов на каждой странице. <br/><br/><b>Html</b> <br/><pre><code class="html">&lt;!doctype html&gt;
&lt;html lang="ru"&gt;

  &lt;head&gt;
    &lt;meta http-equiv="X-UA-Compatible" content="IE=edge"&gt;
    &lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8"&gt;
    &lt;meta name="viewport" content="width=device-width, minimum-scale=1.0"&gt;

    &lt;script src="https://unpkg.com/vue@3"&gt;&lt;/script&gt;
    &lt;script src="https://unpkg.com/vue-router@4"&gt;&lt;/script&gt;

    &lt;script src="https://unpkg.com/@vueuse/head"&gt;&lt;/script&gt;
    &lt;script type="module" src="main.js" defer&gt;&lt;/script&gt;
  &lt;/head&gt;

  &lt;body&gt;
    &lt;div id="app"&gt;
      &lt;nav&gt;
        &lt;router-link to="/"&gt;Главная&lt;/router-link&gt; |
        &lt;router-link to="/contacts"&gt;Контакты&lt;/router-link&gt;
      &lt;/nav&gt;

      &lt;!-- Место для отображения содержимого текущего маршрута --&gt;
      &lt;router-view&gt;&lt;/router-view&gt;
    &lt;/div&gt;
  &lt;/body&gt;

&lt;/html&gt;</code></pre> <br/><br/><b>Main.js</b> <br/><pre><code class="javascript">import { useHead } from '@vueuse/head' // Импорт useHead
import { createApp } from 'vue' // Импорт Vue
import { createRouter, createWebHistory } from 'vue-router' // Импорт Vue Router

const Home = {
	data() {
		return {
			content: '',
		}
	},
	async mounted() {
		this.content = await loadTemplate('/main.php')
		useHead({
			title: 'Главная страница - Vue3 тест',
			meta: [
				{ name: 'description', cont
  • 15 февраля 2025 г. 14:25
Ответы на вопрос 2
Для установки уникальных метаданных, включая заголовок для каждой страницы, используя Vue 3 и библиотеку `@vueuse/head`, необходимо следовать нескольким шагам. Давайте продолжим ваш код и добавим компонент для страницы контактов, чтобы продемонстрировать, как это работает.

### 1. Завершим ваш файл `main.js`

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

```javascript
import { useHead } from '@vueuse/head'; // Импорт useHead
import { createApp } from 'vue'; // Импорт Vue
import { createRouter, createWebHistory } from 'vue-router'; // Импорт Vue Router

// Компонент для главной страницы
const Home = {
  data() {
    return {
      content: '',
    };
  },
  async mounted() {
    this.content = await loadTemplate('/main.php');
  },
  setup() {
    useHead({
      title: 'Главная страница - Vue3 тест',
      meta: [
        { name: 'description', content: 'Это главная страница нашего сайта на Vue3.' },
      ],
    });
  },
  template: `<div v-html="content"></div>`, // Используем v-html для отображения содержимого
};

// Компонент для страницы контактов
const Contacts = {
  template: `<div>
               <h1>Контакты</h1>
               <p>Email: contact@example.com</p>
             </div>`,
  setup() {
    useHead({
      title: 'Контакты - Vue3 тест',
      meta: [
        { name: 'description', content: 'Контактная информация для связи' },
      ],
    });
  },
};

// Настройка маршрутизатора
const routes = [
  { path: '/', component: Home },
  { path: '/contacts', component: Contacts },
];

const router = createRouter({
  history: createWebHistory(),
  routes,
});

// Создание Vue приложения
const app = createApp({});
app.use(router);
app.mount('#app');
```

### 2. Основные изменения и объяснения

1. **Компонент для контактов**: Мы добавили новый компонент `Contacts`, в котором мы также используем `useHead` для задания уникальных метаданных этой страницы.

2. **Маршрутизация**: Мы создали несколько маршрутов: один для главной страницы и один для страницы контактов.

3. **useHead**: В обоих компонентах мы вызываем `useHead` для установки заголовка и метатегов. Это может быть сделано в функции `setup` Vue 3, что позволяет использовать Composition API.

### 3. HTML структура

Ваш HTML остается неизменным, поскольку он уже подготавливает всё необходимое для работы с Vue и Vue Router.

### Заключение

Теперь, когда вы переключаетесь между главной страницей и страницей контактов, заголовки и метаданные будут изменяться в зависимости от контента страницы. Это обеспечит корректное отображение информации о каждой странице как для пользователей, так и для поисковых систем.
Вот <a href="https://vueuse.org/guide/#cdn" rel="nofollow">тут</a> написано, что с cdn надо подключать так: <br/> <pre><code class="html">&lt;script src="https://unpkg.com/@vueuse/shared"&gt;&lt;/script&gt;
&lt;script src="https://unpkg.com/@vueuse/core"&gt;&lt;/script&gt;</code></pre> <br/> <br/> и потом использовать так: <br/> <code class="javascript">const {useTitle} = window.VueUse</code> <br/> <br/> а используемый @vueuse/head для работы через cdn вообще не приспособлен, только с системами сборки.
Похожие вопросы