Vue Slot: как анализировать, а затем визуализировать компоненты слота - PullRequest
0 голосов
/ 02 октября 2018

В настоящее время создаю веб-страницу в Vue, немного разбираю ее, а затем отрисовываю дочерние компоненты <slot>.

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

Что я пробовал

Я пробовал много вариантов вещей, большинство из которых начиналис этим: this.$slots.default

Это последняя версия, которую я пробовал

let slotComponents = [];
this.$slots.default.forEach(vNode => {
  slotComponents.push(vNode);
});

Но я также пытался выбрать элементы в vNode и использовать такие вещи, как $childeren длявыберите компоненты.Пока не повезло.

Потенциальные проблемы

Причиной может быть любое количество вещей, но вот то, что я думал, происходило (по порядку)

  1. Я не получаю компоненты в массив правильно
  2. Я неправильно отображаю их или что-то упустил из-за того, как они отображаются
  3. Vue не должен делать это?

Правка - Контекст

Похоже, было бы проще, если бы я дал вам полный контекст моей конкретной проблемы.

Цель

Для создания динамической вкладки компонента.Должно выглядеть следующим образом.

// Example of component use
<tab-container>
  <tab>
    <!-- Tab Content -->
  </tab>
  <tab>
    <!-- Tab Content -->
  </tab>
  <tab>
    <!-- Tab Content -->
  </tab>
  <trash>
    <!-- This one won't show up -->
  </trash>
</tab-container>

Чтобы разобрать этот контент, мне нужно было получить данные слота.

// Inside the <tabs-container> component
computed: {
  tabs: function() {
        let tabs = []
        this.$slots.default.forEach(vNode => {
            tabs.push(vNode);
        });
        return tabs;
    }
}


// Inside the <tabs-container> template
<div>
    {{tabs[currentTab]}}
</div>

1 Ответ

0 голосов
/ 03 октября 2018

Вы не должны использовать шаблон и вычисленные свойства, если вы хотите программно визуализировать <tab> внутри <tab-container>.{{}} в шаблонах, предназначенных для выполнения основных операций JS.Наиболее подходящим способом будет использование функции рендеринга.

Функции рендеринга - Vue docs

Вот рабочий пример, который использует несколько вкладок компонентов и показывает только активную вкладкукомпонент: https://jsfiddle.net/ajitid/eywraw8t/403667/

...