Динамический тег в компоненте vue 3
8 января 2021 г. 8:03
Для наглядности покажу на конкретном примере.
В SEO есть такое понятие, как циклические ссылки. Например, в меню обычно всегда размещают ссылки на разделы сайта вне зависимости, на какой странице мы находимся. Но если мы находимся на некоторой странице и url текущей страниц совпадает с url кого-то пункта меню, то такая ссылка становится циклической и для SEO это плохо (по крайней мере раньше так точно было).
Таким образом, при совпадении url лучше пункт меню не ссылкой делать тегом a
, а использовать другой тег, например, span
.
Во Vue есть специальная директива :is
, значение которой и будет тегом при рендере:
<component :is="tag">Title</component> При tag = 'span': <span>Title</span> При tag = 'div': <div>Title</div>
В нашем примере меню можно построить так:
# Menu.vue <template> <MenuItem :url="'/'" :title="Главная" /> <MenuItem :url="'/services/'" :title="Услуги" /> <MenuItem :url="'/about/'" :title="О компании" /> </template> <script> import {ref} from "vue"; import MenuItem from "./MenuItem"; export default { components: {MenuItem} } </script>
# Menuitem.vue <template> <component :is="tag" :href="get_url()">{{ title }}</component> </template> <script> import {ref} from "vue"; export default { props: {url, title} setup(props) { const tag = ref('a') if (window.location.href.value === props.url) tag.value = 'span' const get_url = () => tag.value === 'a' ? props.url : null return {get_url, tag} } } </script>
В коде сначала объявляется переменная tag
с начальным значением a
(что соответствует html-тегу "Ссылка"). Если текущий url страницы (window.location.href.value
) совпадает с url пункта меню, то, во-первых, значение tag
меняется на span
, а во-вторых, в href
функция get_url()
возвращает null
.
Так, например, если текущий url равен /services/
, то наше меню срендерится так:
<a href="/">Главная</a> <span>Услуги</span> <a href="/about/">О компании</a>
Обратите внимание, что если мы хотим убрать тег :href
при совпадении url, то нужно возвращать именно null
, а не пустую строку ''
. Иначе при рендере вместо <span>Услуги</span>
Vue отрендерит как <span href>Услуги</span>
. В хроме в инструментах разработчика при просмотре кода можно увидеть что-то типа href (unknown)
.
Это весьма упрощённый пример. В директиве :is в качестве переменной можно указывать не только теги html, но и компоненты Vue.
В документации https://v3.vuejs.org/guide/component-basics.html#dynamic-components описывается использование директивы :is и показан пример. Для начинающих он может показаться сложноватым, поэтому надеюсь, что на более простом рассмотренном примере удалось лучше понять принцип работы :is
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0