v-data-table vuetify не могу разместить иконки

Не могу понять как добавить слева колонку со своими иконками. Примерно понимаю что нужен v-slot и template, но не получается

<template>
  <div>
    <v-data-table
      :headers="headers"
      :items="infoExchanges"
      :items-per-page="5"
      class="elevation-1"
    >
      <template #item.logo="{value}">
        <img :src="value" />
      </template>
    </v-data-table>
  </div>
</template>

В дате лежит

  headers: [
    { text: 'Name', value: 'Name' },
    { text: 'Country', value: 'Country' },
    {
      text: 'logo',
      value:
        'https://telecomdom.com/wp-content/uploads/2020/01/perevodchik-s-russkogo-na-anglijskij.jpg',
    },
    { text: 'GradePoints (%)', value: 'GradePoints' },
  ],

введите сюда описание изображения

Сниппет минимального примера:

new Vue({
  el: '#app',
  vuetify: new Vuetify(),
  data() {
    return {
      infoExchanges: [],
      headers: [
        {
          text: 'logo',
          value: 'https://telecomdom.com/wp-content/uploads/2020/01/perevodchik-s-russkogo-na-anglijskij.jpg',
        },
        { text: 'Name', value: 'Name' },
        { text: 'Country', value: 'Country' },
        { text: 'GradePoints (%)', value: 'GradePoints' },
      ],
    };
  },
  methods: {
    async getApiInfoExchanges() {
      try {
        const response = await fetch(
          'https://min-api.cryptocompare.com/data/exchanges/general'
        );
        const result = await response.json();
        const resultKey = Object.keys(result.Data);

        for (let i = 0; i < resultKey.length; i++) {
          this.infoExchanges.push(result.Data[resultKey[i]]);
        }
      } catch (error) {
        console.error(error);
      }
    },
  },
  created() {
    this.getApiInfoExchanges();
  },
});
<div id="app">
  <v-app>
    <v-main>
      <div>
        <h1 class="titleText mb-6 mt-4 text-center">Информация по биржам</h1>
        <v-data-table
          :headers="headers"
          :items="infoExchanges"
          :items-per-page="5"
          class="elevation-1"
        >
          <template #item.logo="{value}">
            <img :src="value" />
          </template>
        </v-data-table>
      </div>
    </v-main>
  </v-app>
</div>

<script src="https://unpkg.com/vue@2/dist/vue.min.js"></script>
<script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/vuetify/dist/vuetify.min.css">


Ответы (1 шт):

Автор решения: yar85

Имя слота Vuetify генерирует исходя из значения value заголовка (которое соответствует имени свойства каждого объекта в данных).
То есть, получается что слот item.logo отсутствует просто потому что в конфигурации заголовков нет объекта с value: 'logo'.

Когда нужно одинаковое изображение для всех строк таблицы, можно просто указать такое значение value, и захардкодить изображение в шаблоне (отсутствие свойства logo в объектах данных из items, в таком случае - не играет роли, т.к. содержимое слота статично, свойство не используется):

new Vue({
  el: '#app',
  vuetify: new Vuetify(),
  data() {
    return {
      infoExchanges: [],
      headers: [
        { text: 'logo', value: 'logo' },
        { text: 'Name', value: 'Name' },
        { text: 'Country', value: 'Country' },
        { text: 'GradePoints (%)', value: 'GradePoints' },
      ],
    };
  },
  methods: {
    async getApiInfoExchanges() {
      try {
        const response = await fetch(
          'https://min-api.cryptocompare.com/data/exchanges/general'
        );
        const result = await response.json();
        const resultKey = Object.keys(result.Data);

        for (let i = 0; i < resultKey.length; i++) {
          this.infoExchanges.push(result.Data[resultKey[i]]);
        }
      } catch (error) {
        console.error(error);
      }
    },
  },
  created() {
    this.getApiInfoExchanges();
  },
});
.logo { height: 2.5em; }
<div id="app">
  <v-app>
    <v-main>
      <div>
        <h1 class="titleText mb-6 mt-4 text-center">Информация по биржам</h1>
        <v-data-table
          :headers="headers"
          :items="infoExchanges"
          :items-per-page="5"
          class="elevation-1"
        >
          <template #item.logo>
            <img class="logo" src="https://telecomdom.com/wp-content/uploads/2020/01/perevodchik-s-russkogo-na-anglijskij.jpg">
          </template>
        </v-data-table>
      </div>
    </v-main>
  </v-app>
</div>

<script src="https://unpkg.com/vue@2/dist/vue.min.js"></script>
<script src="https://unpkg.com/vuetify/dist/vuetify.min.js"></script>
<link rel="stylesheet" href="https://unpkg.com/vuetify/dist/vuetify.min.css">

Если же хочется показывать разные изображения для разных строк таблицы, то надо менять данные (infoExchanges, в данном случае) - а именно, добавлять в объекты данных свойство logo со значением содержащим ссылку на изображение.
Когда в объектах данных будет такое свойство со ссылкой, подобная разметка в шаблоне будет работать:

<template #item.logo="{ value }">
  <img :src="value">
</template>
→ Ссылка