Я решил свою проблему с помощью интенсивного поиска в Google! Найдена эта проблема относительно Vue на Github, которая указала мне правильное направление.
Небольшой фрагмент предыстории
Я использую Vue в сочетании с Storybook создать библиотеку компонентов, в которой кнопка может быть кнопкой или якорем. Все кнопки выглядят одинаково (кроме цвета) и могут быть использованы для отправки или ссылки. Чтобы упорядочить структуру папок, я бы хотел, чтобы решение генерировало несколько типов кнопок (со ссылкой или без) из одного файла.
Решение
Использование вычисляемых свойств Я могу "вычислить" необходимый тег, основываясь на свойстве url
моего компонента. Когда передается url
, я знаю, что моя кнопка должна ссылаться на другую страницу. Если свойство url
отсутствует, оно должно отправлять что-либо или предварительно настраивать пользовательский обработчик щелчков (нет в приведенном ниже примере кода).
Я создал вычисляемое свойство returnComponentTag
, чтобы избежать размещения сложных или громоздких объектов. logi c (как и мое оригинальное решение) в моем шаблоне. Возвращает тег a
или button
в зависимости от наличия свойства url
.
Далее, как предлагает ajobi, используя атрибут :is
, я могу определить тег компонента на основе результата моего вычисляемого свойства. Ниже приведен пример моего окончательного (и рабочего) решения:
<template>
<component :is="returnComponentTag" v-bind:href="url ? url : ''" class="btn" :class="modifier" :id="id">
{{buttonText}}
</component>
</template>
<script>
export default {
name: "Button",
props: {
id: {
type: Number
},
buttonText: {
type: String,
required: true,
default: "Button"
},
modifier: {
type: String,
default: "btn-cta-01"
},
url: {
type: String,
default: ""
}
},
computed: {
returnComponentTag() {
return this.url ? "a" : "button"
}
}
};
</script>