nuxtjs使用SVG 图标

2020-12-29  本文已影响0人  莫伊剑客
svg图片目录

一、安装依赖

npm i svg-sprite-loader -D

二、修改规则和新增规则,nuxt.config.js

// resolve定义一个绝对路径获取函数 
const path = require('path')
function resolve (dir) { return path.join(__dirname, dir) }
build: {
    /*
    ** You can extend webpack config here
    */
    extend (config, ctx) {
      // 排除 nuxt 原配置的影响,Nuxt 默认有vue-loader,会处理svg,img等
      // 找到匹配.svg的规则,然后将存放svg文件的目录排除
      const svgRule = config.module.rules.find(rule => rule.test.test('.svg'))
      svgRule.exclude = [resolve( 'assets/icons/svg')]
      //添加loader规则
      config.module.rules.push({
        test: /\.svg$/, //匹配.svg
        include: [resolve('assets/icons/svg')], //将存放svg的目录加入到loader处理目录
        use: [{ loader: 'svg-sprite-loader', options: { symbolId: 'icon-[name]' } }]
      })
    }
  }
###三、组件化

<template>
  <svg :class="svgClass" 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;
      } else {
        return "svg-icon";
      }
    }
  }
};
</script>

<style lang="scss" scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill:currentColor;
  overflow: hidden;
}
</style>

四、插件注册

// plugins/svgIcon.js
import Vue from 'vue'
import SvgIcon from '@/components/svgIcon'// Nuxt 默认@指向根目录 

// 注册组件
Vue.component('svg-icon', SvgIcon)
//预请求svg组件(通过之前的svg-sprite-loader加载)
const req = require.context('@/assets/icons/svg', false, /\.svg$/) 
req.keys().map(req);

五、配置文件挂载

// 配置文件挂载
plugins: [
    '@/plugins/svgIcon',
  ],
上一篇 下一篇

猜你喜欢

热点阅读