我是靠谱客的博主 安详小笼包,最近开发中收集的这篇文章主要介绍【VUE】Icon插件封装,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

本地Svg抽象为Icon全局组件,让Icon使用更加优雅,参考手摸手,带你优雅的使用 icon

文章目录

    • IconSvg组件
    • SVG文件自动引入
    • 制作svg-sprite

IconSvg组件

在components文件夹下增加IconSvg文件夹,文件夹中增加index.vue,这里主要定义组件。

<template>
  // 支持使用外链的形式引入 svg。例如:<svg-icon icon-class="https://xxxx.svg />
  <div v-if="isExternal" 
    :style="styleExternalIcon" 
    class="svg-external-icon svg-icon"
    v-on="$listeners" />

  <svg v-else class="svg-icon" aria-hidden="true" v-on="$listeners">
    <use :xlink:href="iconName"></use>
  </svg>
</template>
<script>
import { isExternal } from '@/utils/index.js'

export default {
  name: 'icon-svg',
  props: {
    iconClass: {
      type: String,
      required: true
    },
    className: {
      type: String,
      default: ''
    }
  },
  computed: {
    isExternal() {
      return isExternal(this.iconClass)
    },
    iconName() {
      return `#icon-${this.iconClass}`
    },
    svgClass() {
      if (this.className) {
        return 'svg-icon ' + this.className
      } else {
        return 'svg-icon'
      }
    },
    styleExternalIcon() {
      return {
        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
      }
    }
  },
}
</script>

<style>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: center;
  fill: currentColor;
  overflow: hidden;
}
.svg-external-icon {
  background-color: currentColor;
  mask-size: cover!important;
  display: inline-block;
}
</style>
@/utils/index.js
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
    return /^(https?:|mailto:|tel:)/.test(path)
}

xlink:href 中传入 svg ID 就好了,由于在上面的配置文件中我们直接使用文件名作为 symbol 的 ID,所以这里传入的 ID 即为你想显示的图标的 svg 文件名

SVG文件自动引入

vue项目中src目录下增加icons文件夹:本地svg、入口文件index.js
index.js中内容如下:

// index.js
	import Vue from 'vue'
	import SvgIcon from '@/components/IconSvg'// 引入svg组件

	// 注册全局组件
	Vue.component('svg-icon', IconSvg)
	
	
	// 自动引入svg文件夹下所有.svg文件
	/* require.context,通过正则匹配到可能的文件,全部引入
        require.context(directory, useSubdirectories, regExp ):
                   - directory:说明需要检索的目录
                   - useSubdirectories:是否检索子目录
                   - regExp: 匹配文件的正则表达式
    */
	const req = require.context('./svg', false, /.svg$/)
	const requireAll = requireContext => requireContext.keys().map(requireContext)
	requireAll(req)

制作svg-sprite

使用插件svg-sprite-loader: webpack loader ,可以将多个 svg 打包成 svg-sprite。
vue-cli默认情况下会使用url-loader对svg进行处理,会将它放在/img目录下,所以这时候我们使用webpack配置进行修改。
修改webpack.base.conf.js

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

webpack添加处理svg的loader,第一个用来处理svg的,第二个是去除svg处理的。
main.js中导入icons

import './icons' // icon 引入icons文件夹下所有的icon

到这里就可以直接在代码中直接使用 来引入一个svg图片,只需要修改icon-class为当前svg的名称即可。

<icon-svg icon-class="github" />
<icon-svg icon-class="wechat" />
<icon-svg icon-class="qq" />

效果:
在这里插入图片描述

最后

以上就是安详小笼包为你收集整理的【VUE】Icon插件封装的全部内容,希望文章能够帮你解决【VUE】Icon插件封装所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部