当前位置: 首页 > news >正文

vue3--SVG图标的封装与使用

流程

终端输入- -安装下面这个包

npm install vite-plugin-svg-icons -D

vite.config.ts文件中引入

import {createSvgIconsPlugin} from 'vite-plugin-svg-icons'

vite.config.ts文件中配置plugins选项
将下面代码

createSvgIconsPlugin({
        //用于指定包含 SVG 图标的文件夹路径
        iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
        //定义生成的 SVG 符号(symbol)的 id 属性格式
        symbolId: 'icon-[dir]-[name]',
        })

放置在这里

plugins: [
    vue(),
    vueDevTools(),
    createSvgIconsPlugin({
      iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
      symbolId: 'icon-[dir]-[name]',
    })
  ]

记得引入path

main.ts入口文件引入

import 'virtual:svg-icons-register'

env.d.ts文件写入

declare module "virtual:svg-icons-register";

终端输入- -安装下面这个包

npm i fast-glob -D

按照这个路径“src/assets/icons”创建文件夹并且创建一个svg文件
在这里插入图片描述
粘贴下面代码

<svg t="1739623721311" class="icon" viewBox="0 0 1309 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1816" width="200" height="200"><path d="M1196.889302 23.813953a85.825488 85.825488 0 0 1 85.825489 85.825489v772.524651a85.825488 85.825488 0 0 1-85.825489 85.825488h-114.44986a28.600558 28.600558 0 1 1-57.22493 0H281.314233a28.600558 28.600558 0 1 1-57.224931 0H109.639442A85.825488 85.825488 0 0 1 23.813953 882.164093V109.639442A85.825488 85.825488 0 0 1 109.639442 23.813953H1196.889302z m28.624372 801.12521H81.01507v57.22493a28.600558 28.600558 0 0 0 28.624372 28.600558H1196.889302a28.600558 28.600558 0 0 0 28.624372-28.600558v-57.22493zM939.389023 81.038884H109.639442a28.600558 28.600558 0 0 0-28.600558 28.600558v658.074791h858.350139V81.038884z m257.500279 0h-200.275349v686.675349h228.899721V109.639442a28.600558 28.600558 0 0 0-28.624372-28.600558z m-85.825488 429.175069a85.825488 85.825488 0 1 1 0 171.674791 85.825488 85.825488 0 0 1 0-171.698604z m0 57.224931a28.600558 28.600558 0 1 0 0 57.22493 28.600558 28.600558 0 0 0 0-57.22493zM674.506419 224.946605c15.312372 3.834047 24.647442 19.360744 20.813395 34.673116-9.049302 36.197209-13.407256 62.964093-13.264372 79.443349 0.166698 24.885581 4.381767 50.009302 12.740465 75.53786 20.71814 63.583256 20.71814 127.380837-0.047628 190.392558a28.624372 28.624372 0 1 1-54.343442-17.908093c16.955535-51.414326 16.955535-102.709581 0-154.719255a305.223442 305.223442 0 0 1-15.574325-92.874419c-0.166698-22.313674 4.858047-53.248 15.00279-93.707907a28.600558 28.600558 0 0 1 34.673117-20.837209z m-169.483907 0.642976a28.600558 28.600558 0 0 1 18.003348 36.244838c-16.884093 50.152186-16.884093 100.780651 0.095256 152.790325 20.71814 63.583256 20.71814 127.357023-0.023814 190.368744a28.624372 28.624372 0 1 1-54.367255-17.908093c16.955535-51.414326 16.955535-102.709581 0-154.719255-20.765767-63.630884-20.765767-126.880744 0.047627-188.797024a28.600558 28.600558 0 0 1 36.244838-17.979535z m-171.650977 0a28.600558 28.600558 0 0 1 17.979535 36.244838c-16.860279 50.152186-16.860279 100.780651 0.095256 152.790325 20.741953 63.583256 20.741953 127.357023-0.023814 190.368744a28.624372 28.624372 0 1 1-54.367256-17.908093c16.955535-51.414326 16.955535-102.709581 0-154.719255-20.765767-63.630884-20.765767-126.880744 0.047628-188.797024A28.600558 28.600558 0 0 1 333.395349 225.589581z m777.692279 55.724652a85.825488 85.825488 0 1 1 0 171.67479 85.825488 85.825488 0 0 1 0-171.67479z m0 57.22493a28.600558 28.600558 0 1 0 0 57.22493 28.600558 28.600558 0 0 0 0-57.22493z m28.600558-171.674791a28.600558 28.600558 0 0 1 0 57.22493h-57.22493a28.600558 28.600558 0 0 1 0-57.22493h57.22493z" fill="#111111" p-id="1817"></path></svg>

封装svg组件
在这里插入图片描述

<template>
    <!-- svg:图标外层容器节点,内部需要与use标签结合使用 -->
    <svg :style="{ width, height }">
        <!-- xlink:href执行用哪一个图标,属性值务必#icon-图标名字 -->
        <!-- use标签fill属性可以设置图标的颜色 -->
        <use :xlink:href="prefix + name" :fill="color"></use>
    </svg>
</template>

<script setup lang="ts">
//接受父组件传递过来的参数
defineProps({
    //xlink:href属性值前缀
    prefix: {
        type: String,
        default: '#icon-'
    },
    //提供使用的图标名字
    name: String,
    //接受父组件传递颜色
    color: {
        type: String,
        default: ''
    },
    //接受父组件传递过来的图标的宽度
    width: {
        type: String,
        default: '16px'
    },
    //接受父组件传递过来的图标的高度
    height: {
        type: String,
        default: '16px'
    }
})
</script>
<style scoped></style>

svg全局注册
main.ts文件中写入

//引入svg组件
import svgIcon from './components/svgIcon/index.vue'
//全局注册组件
app.component('SvgIcon',svgIcon)

封装后的使用

<script setup lang="ts">
</script>

<template>
    <SvgIcon name="phone" color="pink" width="60" height="60"></SvgIcon>
</template>

<style scoped>

</style>

相关文章:

  • DeepSeek 助力 Vue 开发:打造丝滑的侧边栏(Sidebar)
  • Windows 11 搭建私有知识库(docker、dify、deepseek、ollama)
  • 250214-java类集框架
  • springboot项目读取 resources 目录下的文件的9种方式
  • 【CubeMX-HAL库】STM32F407—无刷电机学习笔记
  • openAI最新o1模型 推理能力上表现出色 准确性方面提升 API如何接入?
  • vscode ESP32配置
  • 苍穹外卖项目demo开发day3 公共字段自动填充 增删改查菜品
  • 使用llama.cpp在gpu和cpu上运行deepseek-r1 7b的性能对比
  • 计算机组成原理—— 总线系统(十二)
  • pytest测试专题 - 2.1 一种推荐的测试目录结构
  • 编程速递-庆祝Delphi诞生30周年!
  • 2025智能硬件售后服务管理系统选择的六大标准
  • 小项目第一天
  • CAS单点登录(第7版)20.用户界面
  • Centos安装php-8.0.24.tar
  • unity学习41:动画里的曲线curve参数 和 事件 events
  • CAS单点登录(第7版)17.账户注册
  • 深度学习框架探秘|TensorFlow:AI 世界的万能钥匙
  • 安科瑞光伏发电防逆流解决方案——守护电网安全,提升能源效率
  • 哪些网站可以免费做推广呢/域名注册网站查询
  • 视频网站建设 可行性报告/windows优化大师的特点
  • 最便宜网站/免费观看行情软件网站下载
  • 天柱建设局网站/济南特大最新消息
  • 火星免费建网站/百度风云榜明星
  • 陕西省建设监理协会网站主页/百度热榜