vue3中使用svg图片

前言

项目使用cli创建,只适用于cli项目

一、安装依赖

 npm install svg-sprite-loader -D

二、修改vue.config.js

const path = require('path')

function resolve(dir) {
  return path.join(__dirname, '.', dir)
}

module.exports = {
  chainWebpack: config => {
    config.module
      .rule('svg')
      .exclude.add(resolve('src/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()
  },
};

3、创建SvgIcon组件,在src/components/SvgIcon/index.vue

<template>
  <svg :class="svgClass" aria-hidden="true">
    <use :xlink:href="iconName" />
  </svg>
</template>
<script>
export default {
  name: "SvgIcon",
  props: {
    iconClass: {
      type: String,
      required: true,
    },
    className: {
      type: String,
      default: "",
    },
  },
  computed: {
    iconName() {
      return `#icon-${this.iconClass}`;
    },
    svgClass() {
      if (this.className) {
        return "svg-icon " + this.className;
      } else {
        return "svg-icon";
      }
    },
  },
};
</script>
<style scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>

在这里插入图片描述

四、在src文件下创建icons文件夹。文件夹中包括svg文件用来存放svg图片,index.js

在这里插入图片描述
index.js中

const req = require.context('./svg', false, /\.svg$/)

const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)

五、main.js中引入

import { createApp } from 'vue'
import App from './App.vue'
import Antd from 'ant-design-vue';
import router from './router'
import store from './store'
import 'ant-design-vue/dist/antd.css';

//引入
import './icons'
import SvgIcon from '@/components/SvgIcon/index'



//挂载
createApp(App).component('svg-icon', SvgIcon).use(Antd).use(store).use(router).mount('#app')

六、组件中使用

  <svg-icon icon-class="choice" class="choice" />

七、重新运行项目