Задать вопрос
@Masthead

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

Необходимо создать компонент 2 ui таблицы.
Саму таблицу и ее колонку.

<TableCustom :data="data">
    <TableCol prop="age" label="Возраст" width="150">
      <template #header>
        <div>Это заголовок для возраста</div>
      </template>
      <template #body="scope">
        <div>Возраст: {{ scope.row.name }}</div>
      </template>
    </TableCol>

    <TableCol prop="name" label="Имя" width="200">
      <template #header>
      </template>
      <template #body="scope">
        <div>имя {{ scope.row.name }}</div>
      </template>
    </TableCol>
  </TableCustom>

Допустим, реализация кита. Есть основная таблица, в нее передается, к примеру, data = (какой-то массив с данными)
В него передается 2 колонки. В соответсnвии со слотами (хедер или дефолт) должна идти отрисовка в хедере/боди

рисует данные
<TableCol prop="name" label="Имя" width="200">
      <template #header>
        <div>Имя</div>
      </template>
      <template #body="{ scope }">
        <div>Имя: {{ scope.name }}</div>
      </template>
    </TableCol>

Проблема заключается в том, что при доставании слотов, в объекте children - есть эти "слоты" с передаваемыми именами. Но как их заставить рисоваться в шаблоне?
  • Вопрос задан
  • 44 просмотра
Подписаться 1 Средний Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега Vue.js
Вот так:

import { useSlots } from 'vue';

const columns = useSlots().default?.();

<table>
  <thead>
    <tr>
      <th v-for="{ props: p, children: c } in columns" :key="p.prop">
        <component v-if="c?.header" :is="c.header" />
        <template v-else>{{ p.label }}</template>
      </th>
    </tr>
  </thead>
  <tbody>
    <tr v-for="row in data">
      <td v-for="{ props: p, children: c } in columns" :key="p.prop">
        <component v-if="c?.body" :is="c.body" :row="row" />
        <template v-else>{{ row[p.prop] }}</template>
      </td>
    </tr>
  </tbody>
</table>
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы