在vue项目中使用svg图标

svg图标可以随字体一样变色、大小可更改且不失真;应用在项目中不仅可以摆脱img图片占用内存大的问题,还可以减少代码量,优化系统。
使用字体图标的步骤如下:

  1. 安装svg-sprite-loader插件
npm install svg-sprite-loader
  1. 自定义svg-icon组件
    componets文件夹下建立一个svgIcon组件,内容如下:
<template>
  <svg :class="svgClass" aria-hidden="true" v-on="$listeners">
    <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}`;
      }
      return 'svg-icon';
    },
  },
  data() {
    
    
    return {
    
    
    };
  },
};
</script>
<style scoped>
.svg-icon{
    
    
  width: 1em;
  height: 1em;
  fill: currentColor; /* 图标填充颜色,currentColor是一个变量,表示当前元素的color值,如当前无指定,则从父元素继承 */
  overflow: hidden;
}
</style>
  1. src目录下新建文件夹icons放置svg图标文件,并在index.js中注册svgIcon为全局组件
    建目录如下:svg图标及index.js
    在这里插入图片描述
    index.js文件代码
// 引入vue
import Vue from 'vue';
// 引入svgIcon组件
import SvgIcon from '@/components/SvgIcon.vue';
// 注册为全局组件
Vue.component('svg-icon', SvgIcon);
// 引入当前svg目录下的文件、不遍历子目录、匹配以'.svg'为结尾的文件
const req = require.context('./svg', false, /\.svg$/);
// 相当于 req.keys().forEach(key => req(key)), req.keys()是匹配到的svg文件的路径数组
const requireAll = (requireContext) => requireContext.keys().map(requireContext);
// 得到一个完整解析的module数组
requireAll(req);

这个打印reqreq.keys()的结果
在这里插入图片描述
5. 配置vue.config.js

const path = require('path');
// 在vue.config.js中没有配置 resolve 方法, 需要自定义一个
function resolve(dir) {
    
    
  return path.join(__dirname, dir);
}
module.exports = {
    
    
  chainWebpack: (config) => {
    
    
    // set svg-sprite-loader
    config.module.rules.delete('svg'); // 重点:删除默认配置中处理svg
    config.module
      .rule('svg-sprite-loader')
      .test(/\.svg$/)
      .include
      .add(resolve('src/icons')) // 处理svg目录
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
    
    
        symbolId: 'icon-[name]',
      });
  },
};
  1. 在页面中使用svg图标
<svg-icon :iconClass="'alarm'"></svg-icon>

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42060560/article/details/120829922