美文网首页vue
项目使用svg图标

项目使用svg图标

作者: __笑我一世沉沦丶 | 来源:发表于2019-06-26 16:39 被阅读0次

    vue-element-admin基础模板中,已经封装好了使用svg图标的组件,此组件在vue-ssr项目中也同样适用,所在路径为:@/icons,在其中我们可以找到相关的代码,所有在文件夹中的svg图片注册到全局中,可以在项目中任意地方使用。所以图标均可在 @/icons/svg。可自行添加或者删除图标,所以图标都会被自动导入,无需手动操作。
    原理:
    使用require.context() 函数来创建自己的 context
    可以给这个函数传入三个参数:一个要搜索的目录,一个标记表示是否还搜索其子目录, 以及一个匹配文件的正则表达式。
    webpack 会在构建中解析代码中的 require.context()

    require.context('./test', false, /\.test\.js$/);
    //(创建出)一个 context,其中文件来自 test 目录,request 以 `.test.js` 结尾
    require.context('../', true, /\.stories\.js$/);
    // (创建出)一个 context,其中所有文件都来自父文件夹及其所有子级文件夹,request 以 `.stories.js` 结尾。
    

    使用方式:

    <!-- icon-class 为 icon 的名字; class-name 为 icon 自定义 class-->
    <svg-icon icon-class="password"  class-name='custom-class' />
    
    import Vue from 'vue'
    import SvgIcon from '@/components/SvgIcon'// svg component
    // register globally
    Vue.component('svg-icon', SvgIcon)
    const req = require.context('./svg', false, /\.svg$/)
    const requireAll = requireContext => requireContext.keys().map(requireContext)
    requireAll(req)
    

    将这段代码在main中引入,或者在createApp中使用,就可以匹配到svg文件夹下的所有图片,我们可以通过这些将svg图片用webpack相关组件制作成svg-sprint雪碧图
    require.context("./test", false, /.test.js$/);
    这行代码就会去 test 文件夹(不包含子目录)下面的找所有文件名以 .test.js 结尾的文件能被 require 的文件。
    更直白的说就是 我们可以通过正则匹配引入相应的文件模块。
    require.context有三个参数:
    directory:说明需要检索的目录
    useSubdirectories:是否检索子目录
    regExp: 匹配文件的正则表达式

    之后我们增删改图标直接直接文件夹下对应的图标就好了,什么都不用管,就会自动生成 svg symbol了。

    我们找到引入的svg组件@/components/SvgIcon

    <template>
      <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
      <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
        <use :xlink:href="iconName" />
      </svg>
    </template>
    <script>
    import { isExternal } from '@/utils/validate'
    export default {
      name: 'SvgIcon',
      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>
    

    svg中无法使用{{}}渲染传递的值,因此我们只能直接使用传递的iconClass,或者在computed中拼接字符串,我们可以看到iconName即为生成的svg名称,由于拼接的字符串和iconfont中的svg格式不一样,所以我们直接使用会没有任何效果,我们只需要把此处的格式改为return `#:-${this.iconClass}
    然后我们在main.js中引入iconfont的svg文件iconfont.js,就可以在全局中使用iconfont中的svg标签了。
    图标样式通过svgClass来控制

    相关文章

      网友评论

        本文标题:项目使用svg图标

        本文链接:https://www.haomeiwen.com/subject/xpgccctx.html