@wakenby

Как создать табы на vue?

Хочу создать такие табы:
600323ffcf3f3580063780.png

Чтобы при смене активной кнопки, линия перемещалась(ездила) до активной кнопки. Но не понимаю как такое сделать, работать с dom напрямую плохая практика, а как средствами vue сделать не могу даже предположить как
  • Вопрос задан
  • 1362 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
работать с dom напрямую плохая практика

Не всегда. Зависит от задачи.

Пусть компонент табов принимает в качестве параметров массив значений, описывающих табы и значение, обозначающее активный таб:

props: [ 'items', 'value' ],

В данные компонента положим стили для элемента, изображающего подчёркивание активного таба:

data: () => ({
  sliderStyles: null,
}),

Создадим сами табы и элемент подчёркивания:

<ul class="tabs">
  <li
    v-for="n in items"
    :key="n.value"
    @click="$emit('input', n.value)"
    class="tabs-item"
  >{{ n.text }}</li>
</ul>
<div
  class="tabs-slider"
  :style="sliderStyles"
></div>

Элементу подчёркивания (.tabs-slider) зададим абсолютное позиционирование и transition.

Настроим слежение за текущим значением - узнаём его индекс среди доступных для выбора значений, записываем в стили элемента подчёркивания позицию и размер таба с соответствующим индексом:

mounted() {
  this.$watch(
    'value',
    value => {
      const index = this.items.findIndex(n => n.value === value);
      const el = this.$el.querySelectorAll('.tabs-item')[index];
      this.sliderStyles = el
        ? {
            left: `${el.offsetLeft}px`,
            width: `${el.offsetWidth}px`,
          }
        : null;
    },
    {
      immediate: true,
    }
  );
},

https://jsfiddle.net/vsr5tLue/
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
кажется Вы все смешали воедино. табы или кнопки?
переключение активных пунктов можно сделать через vue-router

или так (нашел поиском),
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы