Как в Vue 3 импортировать файлы SVG?

Как можно реализовать рендеринг svg иконок в зависимости от значения селекта, чтобы отображать их в таблице с данными? Предложенный вариант использования Object.assign не подходит для работы с SVG компонентами. Каким образом можно корректно импортировать svg, чтобы затем использовать их в шаблоне?
  • 3 февраля 2024 г. 9:58
Ответы на вопрос 2
В Vue 3 вы можете импортировать SVG файлы и использовать их как компоненты при помощи специальных загрузчиков, если вы используете сборщик, такой как Webpack, или Vue CLI, которые обычно уже настроены для работы с SVG. Если вам необходимо вручную настроить обработку SVG файлов, вы можете использовать `vue-svg-loader` или `svg-inline-loader`.

Давайте рассмотрим на примере использование `vue-svg-loader` с Webpack:

1. Установка `vue-svg-loader`:

```sh
npm install vue-svg-loader --save-dev
```

2. Настройка Webpack (как правило, в файле `vue.config.js` при использовании Vue CLI):

```js
module.exports = {
  chainWebpack: config => {
    // Используем vue-svg-loader для загрузки .svg файлов.
    const svgRule = config.module.rule('svg');
    svgRule.uses.clear();
    svgRule
      .use('vue-svg-loader')
      .loader('vue-svg-loader');
  }
};
```

3. Импорт SVG файла в компоненте Vue как компонент:

```vue
<script>
// Импортируем SVG иконку как Vue компонент
import MyIcon from '@/assets/my-icon.svg';

export default {
  components: {
    MyIcon
  }
}
</script>

<template>
  <div>
    <!-- Используем SVG иконку как компонент -->
    <my-icon />
  </div>
</template>
```

Чтобы реализовать рендеринг SVG иконок в зависимости от значения селекта и отобразить их в таблице с данными, вы можете использовать метод `computed properties` или `methods` для динамического определения, какой SVG компонент должен быть отрендерен.

Пример с `computed property`:

```vue
<template>
  <select v-model="selectedIcon">
    <option value="icon1">Icon 1</option>
    <option value="icon2">Icon 2</option>
  </select>
  
  <table>
    <tr v-for="item in items" :key="item.id">
      <td>
        <!-- Отображаем иконку в зависимости от значения selectedIcon -->
        <component :is="getIcon(item.type)" />
      </td>
      <td>{{ item.data }}</td>
    </tr>
  </table>
</template>

<script>
import Icon1 from '@/assets/icon1.svg';
import Icon2 from '@/assets/icon2.svg';

export default {
  components: {
    Icon1,
    Icon2
  },
  data() {
    return {
      selectedIcon: 'icon1',
      items: [
        { id: 1, type: 'icon1', data: 'Data 1' },
        // другие данные...
      ]
    };
  },
  methods: {
    getIcon(type) {
      const icons = {
        icon1: Icon1,
        icon2: Icon2
      };
      return icons[type] || null;
    }
  }
}
</script>
```

В этом примере, основываясь на выбранном значении `selectedIcon`, рендерится соответствующий SVG компонент. Объект `icons` используется как карта для соответствия типам иконок и их компонентам.
1) Можно создать отдельный компонент с иконкой (или набором иконок) и импортировать его. 

2) Можно использовать vue-svg-loader, Vite SVG loader или аналогичные библиотеки.
Похожие вопросы