@hckn

Как рендерить слоты в списке?

Есть компонент, по сути список, где слоты должны быть заполнены собственно предметами списка.
Есть компонент, который и есть предмет списка.

В итоге, все предметы рендерятся в первый элемент списка. Как сделать чтобы каждый предмет уходил в отдельный li?

https://codesandbox.io/s/qzrwqppqqq
  • Вопрос задан
  • 304 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
Честно говоря, не очень понятно - а зачем тут вообще слоты. Передавайте в компонент данные обычным параметром, на их основе создавайте список.

Но если всё-таки нужно использовать именно слот - пишите собственную render-функцию. Т.е., вместо шаблона, который есть у вас сейчас, будет что-то вроде

export default {
  render(h) {
    return h('ul', this.$slots['list-item'].map(n => h('li', [ n ])));
  },
};


UPD. Если, помимо собственно списка в будущем планируется добавить в компонент List ещё какие-то элементы, то наверное будет не очень удобно рендерить всё это дело через функцию, поэтому можно написать небольшой компонент-обёртку для элементов слота:

components: {
  SlotWrapper: {
    functional: true,
    render: (h, context) => context.props.node,
  },
},

<li v-for="n in $slots['list-item']">
  <slot-wrapper :node="n"></slot-wrapper>
</li>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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