[Vuejs] svg-sprite-loader实现加载svg自定义组件

摘要:
$/,loader:'url-loader',options:{limit:10000,name:utils.assetsPath}},增加一行exclude:[resolve],意思是用url-loader加载的时候过滤掉文件夹src/assets/svg下面的文件即{test:/.(png|jpe?

1、安装 svg-sprite-loader

npm install svg-sprite-loader -D

或者

npm install svg-sprite-loader --save-dev

2、将所有svg图片放到assets/svg下,以此为例,修改文件 build/webpack.base.conf.js

找到代码:

{
  test: /.(png|jpe?g|gif|svg)(?.*)?$/,loader: 'url-loader',
  options: {
    limit: 10000,
    name: utils.assetsPath('img/[name].[hash:7].[ext]')
  }
},

增加一行

exclude: [resolve("src/assets/svg")],

意思是用url-loader加载的时候过滤掉文件夹src/assets/svg 下面的文件

{
  test: /.(png|jpe?g|gif|svg)(?.*)?$/,
  exclude: [resolve("src/assets/svg")],
  loader: 'url-loader',
  options: {
    limit: 10000,
    name: utils.assetsPath('img/[name].[hash:7].[ext]')
  }
},

同时在后面增加一条规则

{
  test: /.svg$/,
  loader: "svg-sprite-loader",
  include: [resolve("src/assets/svg")],
  options: {
    symbolId: "[name]"}
}

3、自定义SvgIcon组件

在components新建 SvgIcon.vue

<template>
  <svg :class="svgClass":style="style"aria-hidden="true">
    <use :xlink:href="`#${name}`"></use>
  </svg>
</template>

<script type="text/ecmascript-6">export default{
  name: 'svg-icon',
  props: {
    name: {
      type: String,
      required: true},
    className: {
      type: String
    },
     {
      type: String,
      default: '5vw'},
    height: {
      type: String,
      default: '5vw'}
  },
  data () {
    return{
      style: {
         this.width,
        height: this.height
      }
    }
  },
  computed: {
    svgClass () {
      if(this.className) {
        return 'svg-icon ' + this.className
      } else{
        return 'svg-icon'}
    }
  }
}
</script>

<style>.svg-icon {width:5vw;height:5vw;fill:currentColor;overflow:hidden;
}
</style>

其中绑定了class和style,在用这个组件的时候可以直接设置宽度和高度以及类名,额外的属性可以自己扩展。

4、创建svg.js用于注册SvgIcon组件和批量引入svg图片,我创建在src/utils/svg.js

import Vue from 'vue'
import SvgIcon from '../components/SvgIcon.vue'
Vue.component('svg-icon', SvgIcon)

//引入所有svg
const requireAll = requireContext =>requireContext.keys().map(requireContext)
const req = require.context('../assets/svg', false, /.svg$/)
//const iconMap = requireAll(req)//console.log(iconMap)
requireAll(req)

5、用法

<svg-icon name="icon-pc"width="12vw"height="12vw"></svg-icon>

name值即为svg图片名称,如上icon-pc,即为icon-pc.svg

免责声明:文章转载自《[Vuejs] svg-sprite-loader实现加载svg自定义组件》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇rsync详细配置当在SCOM 2007 SP1环境下遭遇SQLSERVER进程持续占用CPU 100%的解决办法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Vue2+VueRouter2+webpack 构建项目实战(二):目录以及文件结构

通过上一篇博文《Vue2+VueRouter2+webpack 构建项目实战(一):准备工作》,我们已经新建好了一个基于vue+webpack的项目。本篇文章详细介绍下项目的结构。 项目目录以及文件结构 如图所示: 如上图所示,自动构建的vue项目的结构就是这样。 目录/文件 说明 build 这个是我们最终发布的时候会把代码发布在这里,在开发...

VUE 网页端改成桌面端(Electron)

展示效果    1、安装vue-cli   前提安装:http://nodejs.cn/download/   npm install -g @vue /cli  // 安装   vue --version  // 查询版本 2、创建项目   vue create 项目名 3、安装成功后执行   vue add electron-builder 4、运行...

vue-awesome-swiper 配置 (分页不显示鼠标无效渐变无效等)

代码片断 import { Swiper, EffectFade, Mousewheel, Pagination } from 'swiper' import { directive } from 'vue-awesome-swiper' import 'swiper/swiper-bundle.css' Swiper.use([EffectFade,...

vuejs 组件 移动端push 没有渲染页面

this.idcards.push(arr) 这个无效 就知道了 vuejs有个跟push相同的方法 console.log(this.list.push.toString()) 这个push是个同名方法并非 native 的 array push只有用它这个“假”方法才能运行监听函数更新视图 你直接用 Array.prototype.push.app...

VueX中state变化捕捉不到_getters监测不到state的变化

原因 可能有多种原因, 现在我说一下我碰到的一种情况: state种有一个变量叫state,它是一个json对象, 可把我害惨了.因为他这个json长这个样: messageBox:{ friendId1: [ {message1}, {message2}, ... ], friendId2: [ {message1}, {message2},...

vue单页面项目返回上一页无效,链接变化了,但是页面没有变化

在最近的项目中,返回上一页没有效果,经过好久的排查才发现问题,是路由守卫写法不规范导致。 在项目中用路由守卫做了登录拦截,没登录的跳转到登录页面。页面跳转和拦截都没问题,但是返回上一页就不行了,也没有报错。 代码贴上来 router.beforeEach((to, from, next) =>{ if (to.meta.loginChec...