前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Vue3 使用 svg-sprite-loader 实现 svg 图标按需加载

Vue3 使用 svg-sprite-loader 实现 svg 图标按需加载

作者头像
Leophen
发布2020-12-22 16:05:46
发布2020-12-22 16:05:46
7.6K10
代码可运行
举报
文章被收录于专栏:Web前端开发Web前端开发
运行总次数:0
代码可运行

前面文章有讲到 svg 图标按需加载的优势以及 Vue 如何使用 vue-svg-icon 实现 svg 图标按需载入

今天来学习一下使用 svg-sprite-loader 在 Vue3 项目中实现图标按需加载

1、将 email.svg 文件导入项目

代码语言:javascript
代码运行次数:0
运行
复制
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
  <path d="M4 4H20C21.1 4 22 4.9 22 6V18C22 19.1 21.1 20 20 20H4C2.9 20 2 19.1 2 18V6C2 4.9 2.9 4 4 4Z" stroke="currentColor"
    stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
  <path d="M22 6L12 13L2 6" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" />
</svg>

这里将 svg 图标中对应的图标颜色值改为字符串 currentColor,方便使用时控制图标实时颜色

将图标放在特定文件夹下,这里以 @/assets/svg 中导入的 svg 为例

2、安装 svg-sprite-loader

代码语言:javascript
代码运行次数:0
运行
复制
npm i svg-sprite-loader

3、配置 vue.config.js

代码语言:javascript
代码运行次数:0
运行
复制
const path = require("path");

module.exports = {
  // 配置使用stylus全局变量
  chainWebpack: config => {
    const svgRule = config.module.rule("svg");
    svgRule.uses.clear();
    svgRule
      .use("svg-sprite-loader")
      .loader("svg-sprite-loader")
      .options({
        symbolId: "icon-[name]"
      })
      .end();
  }
};

4、新建 SvgIcon.vue 文件,这里可传入 name 属性控制图标类型,传入 size 属性控制图标大小,传入 color 属性控制图标颜色

代码语言:javascript
代码运行次数:0
运行
复制
<template>
  <svg
    class="svg-icon"
    :style="{
      width: props.size + 'px',
      height: props.size + 'px',
      color: props.color
    }"
    @mousedown="clickIcon"
  >
    <use :xlink:href="`#icon-${props.name}`" :fill="props.color" />
  </svg>
</template>

<script lang="ts">
import { defineComponent } from "vue";

export default defineComponent({
  name: "SvgIcon",
  props: {
    name: {
      type: String,
      required: true,
      default: "email"
    },
    size: {
      type: Number,
      default: 32
    },
    color: {
      type: String,
      default: "#000"
    }
  },
  setup(props) {
    return {
      props
    };
  }
});
</script>

5、在 src 目录下新建 plugin.ts

代码语言:javascript
代码运行次数:0
运行
复制
import SvgIcon from "@/pages/components/SvgIcon.vue";

const componentPlugin: any = {
  install: function(vue: any, options: any) {
    if (
      options &&
      options.imports &&
      Array.isArray(options.imports) &&
      options.imports.length > 0
    ) {
      // 按需引入图标
      const { imports } = options;
      imports.forEach((name: any) => {
        require(`@/assets/svg/${name}.svg`);
      });
    } else {
      // 全量引入图标
      const ctx = require.context("@/assets/svg", false, /\.svg$/);
      ctx.keys().forEach(path => {
        const temp = path.match(/\.\/([A-Za-z0-9\-_]+)\.svg$/);
        if (!temp) return;
        const name = temp[1];
        require(`@/assets/svg/${name}.svg`);
      });
    }
    vue.component(SvgIcon.name, SvgIcon);
  }
};
export default componentPlugin;

6、在 main.js(或 main.ts)中引入上面的 plugin 文件

代码语言:javascript
代码运行次数:0
运行
复制
import plugin from "./plugin";

createApp(App)
  .use(plugin, {
    imports: []
  })

7、图标组件的使用

代码语言:javascript
代码运行次数:0
运行
复制
<SvgIcon name="email" :size="24" color="#777" />
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、将 email.svg 文件导入项目
  • 2、安装 svg-sprite-loader
  • 3、配置 vue.config.js
  • 4、新建 SvgIcon.vue 文件,这里可传入 name 属性控制图标类型,传入 size 属性控制图标大小,传入 color 属性控制图标颜色
  • 5、在 src 目录下新建 plugin.ts
  • 6、在 main.js(或 main.ts)中引入上面的 plugin 文件
  • 7、图标组件的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档