在 vue3 中构建 SvgIcon 组件

2023-11-02

效果图

 1.  组件编写 components/SvgIcon.vue

<script setup>
import { computed } from 'vue'

const props = defineProps({
  name: {
    type: String,
    required: true
  },
  className: String,
  color: String,
  width: String,
  height: String
})

const iconName = computed(() => `#icon-${props.name}`)
const svgClass = computed(() => {
  let className = props.className ? `icon-${props.className}` : '';
  return ['svg-icon', className]
})

</script>
<template>
  <!-- aria-hidden: 让这个元素对浏览器隐藏 -->
  <svg :class="svgClass" :style="{ color, width, height }" aria-hidden="true" v-bind="$attrs">
    <use :xlink:href="iconName" />
  </svg>
</template>

<style scoped>
.svg-icon {
  width: 1.3em;
  height: 1.3em;
  vertical-align: -0.3em;
  fill: currentColor;
  overflow: hidden;
}
</style>

2. 创建文件夹 assets/svg 文件夹,存放 .svg 文件

 3. 安装依赖

3.1 安装 svg 依赖 vite-plugin-svg-icons

3.2 配套安装 fast-glob

yarn add vite-plugin-svg-icons
yarn add fast-glob
// or
npm install vite-plugin-svg-icons
npm install fast-glob

4. vite.config.js 编写

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";

// https://vitejs.dev/config/
import { resolve } from "path";

export default defineConfig({
  resolve: {
    alias: {
      "@": resolve(__dirname, "./src"),
    },
  },
  plugins: [
    vue(),
    createSvgIconsPlugin({
      // 指定缓存文件
      iconDirs: [resolve(process.cwd(), "src/assets/svg")],
      // 指定symbolId格式
      symbolId: "icon-[dir]-[name]",
    }),
  ],
});

5. main.js 编写

import { createApp } from "vue";
import App from "./App.vue";
// svg 组件
import SvgIcon from "@/components/SvgIcon.vue";
import "virtual:svg-icons-register";

const app = createApp(App);
app.component("svg-icon", SvgIcon).mount("#app");

6. 使用

<script setup>
</script>

<template>
  <div id="app">
    <!--  name: 必填 svg 的文件名
          className: 选填 class 类名
          color: 选填 颜色
          width: 选填 宽
          height: 选填 高  -->
    <svg-icon name="phone" color="red" width="50" height="50"></svg-icon>
  </div>
</template>

<style scoped>
</style>

7. 特别提示:如果 color 属性无效,需删除 .svg 文件里 fill="" 属性

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 vue3 中构建 SvgIcon 组件 的相关文章

  • 我应该创建一个块还是一个元素 BEM CSS?

    Bem官网说 创建一个块如果一段代码可以被重用并且它不依赖于正在实现的其他页面组件 创建一个元素如果一段代码在没有父实体 块 的情况下无法单独使用 我有一个 关于部分 块 它的元素依赖于父级并且不能在网站中重复使用 如何根据 bem 这段代
  • 为什么我的 Web 组件 CSS 不显示?我没有使用shadowDOM

    我有一个没有使用 ShadowDOM 的 Native V1 组件 所以我将 CSS 放在 但是当其他人使用我的组件时 我的 CSS 就不再起作用了 仅当其组件确实使用 ShadowDOM 时才会发生这种情况 我的组件的示例代码 class
  • 提升变焦不起作用

    我正在使用带有苹果风格幻灯片画廊的提升缩放功能 一切正常 然而 缩放功能会放大被滑块隐藏的隐藏图像 直到单击缩略图时它们变得可见 启动缩放插件的原始代码是 zoom 01 elevateZoom 我从其他问题中得到了下面的 JavaScri
  • CSS3 - 性能最佳实践是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何向 div 添加“闪耀”叠加层?

    如何添加如下图所示的漂亮叠加层 考虑以下 HTML 我将如何添加这样的覆盖层 我知道我可以在它上面使用渐变 并对角应用它 但我也可以弯曲它吗 div class photostrip div class overlay div img sr
  • 带条纹的自定义字体 src

    以此作为参考https stripe com docs elements reference stripe elements https stripe com docs elements reference stripe elements
  • 我不明白 flex-grow 属性吗?

    恐怕我一定不明白flex grow 如果你跳到下面的 JSFiddle 按照我的理解 big应该是另一个大小的三倍 flex item 正如你所看到的 事实并非如此 为什么 http jsfiddle net nrur6mmo http j
  • 表格底部的粘性滚动条

    我不确定 粘性 是否是这个术语 但是有没有办法使滚动条overflow auto保持可见 我有一个相当大的表格 我希望它可以水平滚动 但是 表格也相当高 因此当页面加载时 水平滚动条不在浏览器的视口内 因此很难判断表格是否可滚动 div s
  • Opera 中 margin-bottom 的计算方式不同

    我有一个具有相对位置的 div 和一个具有绝对位置的子 div div class out div div div CSS container width 100px height 100px position relative insid
  • GWT - css 中常量的问题

    我是 GWT 新手 我正在构建一个小型示例应用程序 我有几个 CSS 文件 我能够成功使用 ClientBundle 和 CssResource 将样式分配给 UiBinder 脚本中定义的元素 现在我想更进一步 使用 def css ru
  • 在选择 tr 来覆盖父 div 上的第 n 个子类时,如何使用 jquery addClass ?

    我用它来选择一个 tr 当单击它来更改 tr 的颜色时 tr click function this addClass selected siblings removeClass selected 参见小提琴http jsfiddle ne
  • jQuery / CSS3 动画阴影效果

    所以这个问题可能会被否决 但我认为有人可能会提供帮助 我正在寻找的效果是蓝色块像气球一样上下盘旋 当块上 下移动时 阴影在其下方不断增大和缩小 关于如何编程的任何想法 或者有人知道可以完成的教程 插件吗 你可以使用 jQuery 来完成 或
  • 如何让浮动的div对齐到顶部?

    下面的代码可以在这个小提琴中查看 http jsfiddle net VgG55 10 http jsfiddle net VgG55 10 我有以下标记 其中 div 按以下顺序放置 div class wrapper div class
  • 使用 Javascript/jQuery 和 CSS 更改 PNG 颜色

    我有一个黑色的心 PNG http 1 bp blogspot com yq ZSKg39Tk TOvzVx9sC5I AAAAAAAAAb0 GcN4O Ciq3s s1600 black heart png我想用不同的颜色显示 如何使用
  • 在这个页面中,悬停不起作用,我不知道为什么,而且页脚也没有占用 100% 宽度,即使我已经给了它

    我的编码是否不正确 或者悬停和页脚有什么问题 我需要知道 php 邮件程序是正确的还是我有错误 我无法找到错误 因为邮件功能在本地服务器上不起作用
  • 在引导程序中使用容器流体会导致水平滚动条

    这是一个简单的例子 div class container fluid div class row div class col lg 12 DUMMY CONTENT div div div Fiddle 演示 http jsfiddle
  • 如何在 flutter/dart 中使用设定大小的自定义字体?

    我正在尝试使用color fontWeight and fontFamily with style style copyWith 我尝试使用的自定义字体是Vonique 我已经将它像这样导入到pubspec yaml fonts famil
  • JSDoc:如何在生成的文档中包含自定义 css 文件模板?

    JS文档docs https jsdoc app about configuring default template html say 将图像目录复制到输出目录 复制全部 将 myproject static 中的静态文件复制到输出目录
  • 滚动时静态标题

    我编写了一个主页 现在我正在尝试构建一个标题 该标题是静态的 就像在滚动内容时不滚动一样 当内容位于其下方时 它应该保持在顶部 我找到了这个解决方案here https stackoverflow com questions 9677894
  • 当我“显示:无”一个 SVG 时,另一个(独立的)SVG 会以不同的方式呈现

    我已经伤透了几个小时了 这没有任何意义 我将遇到的问题减少到这个codepen https codepen io Octopous pen OJORpJQ https codepen io Octopous pen OJORpJQ HTML

随机推荐

  • 关于element-ui表格table设置header-cell-class-name样式不起作用的原因分析

    在编写表格的时候想给表头添加样式 使用 header cell class name怎么都添加不上样式 检查元素发现连class都没添加上 查了很多资料有人说element之前版本不支持这属性 但我使用的并不是之前的版本啊 有人说是添加sc
  • 柚城后台管理系统--Vue+ElementUi+MySQL+NodeJs

    柚城后台管理系统 介绍 该项目是基于前后端分离的开发模式 基于Vue技术栈的SPA单页面项目 后端主要操作数据库并向前端暴露一些API接口 前端主要负责绘制页面同时 利用ajax调用后端提供的接口 具体实现功能有 用户管理 权限管理 商品管
  • Aviator表达式

    1 正则表达式 匹配 Map
  • 如何在Unity中使用AR Foundation和ARCore创建一个项目并编译到Android 11手机设备中

    最近又开始学如何使用Unity进行AR开发 因为Unity开发的AR Foundation在各种设备 例如Android iOS HoloLens 的原生AR SDK 例如ARCore ARKit Windows 10 SDK 上进行了封装
  • Flutter Overlay、OverlayState、OverlayEntry 叠加 Toast Demo

    叠加组件 可以悬浮在其他组件上边 我们通常使用他开发Toast PopupWindow弹窗等 虽然可以直接创建Overlay 但最常见的是在WidgetsApp或MaterialApp中使用导航器创建的叠加层 使用方法 获取实例 Overl
  • ajax用iframe,使用ajax Post请求更新iframe内容

    我正在制作Rich文本编辑器 我有一个textarea和一个iframe 我想更新一个iframe内容点击某个按钮 其中ajax post请求传递给它textareas值 这是我的HTML代码 这是js view function func
  • 微服务容器化实践——微服务引入的问题和解决方案

    文章目录 什么是微服务 微服务的不足 微服务的好处 微服务架构引入的问题及解决方案 单体架构与微服务架构的对比 什么是微服务 使用一套小服务来开发单个应用的方式 每个服务运行在独立的进程里 一般采用轻量级的通讯机制互联 并且它们可以通过自动
  • 数据库:存放变长记录的Page类代码实现

    原文链接 https littlefish33 cn DataBase SimplePage 设计思路 代码实现 Page类的初始化结构 插入记录的一种情况 删除记录 插入记录的另一种情况 排序 总结 设计思路 文章实现的思路大致参考教材D
  • vue项目关闭提交代码时的代码校验(整理)

    赋链接一份 其他博主文章 记录 vue项目关闭提交代码时的代码校验 vue vue项目一般会有一个提交代码时的校验 一般提交需要git commit m no verify 才能跳过校验 不想每次提交都输入 no verify可以进行如下配
  • C++operator()(重载小括号运算符)

    在C 语言中有时候需要重载运算符 今天我们主要介绍它主要应用的场合 仿函数 先考虑一个简单的例子 假设有一个vector 你的任务是统计长度小于5的string的个数 如果使用count if函数的话 你的代码可能长成这样 bool Len
  • CESM2 实验笔记

    文章目录 一 关于重启 运行方式 重启文件 初始文件 1 重新启动 RESTART 1 1 关于重启文件 2 RUN TYPE 初始化运行方式 startup branch hybrid 3 branch 或者 hybrid运行的示例 4
  • SQL注入漏洞(绕过篇)

    在学习完了SQL注入的原理 SQL注入的类型后那么可以说SQL注入已经大致了解了 但事实是现实中开发人员不可能让你这么简单就攻击到数据库 他们一般会对已输入或可输入的数据做一定限制 这篇文章我主要对SQL注入中代码或者waf过滤的绕过做一次
  • 网络安全设备之防火墙技术详解

    一 防火墙概述 1 网络防火墙简介 无论是大中型企业网络 还是小型家庭办公网络 对网络安全方面的要求一直保持上升趋势 微软公司的官方网站尚且难逃黑客的魔爪 普通的中小网络更是难以抵抗了 解决网络安全问题最常用的防护手段就是安装网络防火墙 对
  • 2023最新CISP模拟考试题库及答案(一)

    1 在橙皮书的概念中 信任是存在于以下哪一项中的 A 操作系统 B 网络 C 数据库 D 应用程序系统 答案 A 备注 标准和法规 TCSEC 2 下述攻击手段中不属于DOS攻击的是 A Smurf攻击 B Land攻击 C Teardro
  • 593. Valid Square

    Given the coordinates of four points in 2D space return whether the four points could construct a square The coordinate
  • 【DL】第 4 章 : 什么是神经网络:概述、应用和优势

    大家好 我是Sonhhxg 柒 希望你看完之后 能对你有所帮助 不足请指正 共同学习交流 个人主页 Sonhhxg 柒的博客 CSDN博客 欢迎各位 点赞 收藏 留言 系列专栏 机器学习 ML 自然语言处理 NLP 深度学习 DL fore
  • jupyter notebook导入上级目录的文件

    在jupyter中 使用 os path realpath 可以得到当前文件的路径 import sys import os os chdir os path dirname os path realpath sys path insert
  • Keepalived,基于 CentOS 7构建nginx的Keepalived 高可用群集。

    目录 1 简述 Keepalived 的主要功能 应用场合 2 使用 Keepalived 实现双机热备时 主 备服务器的配置存在哪些区别 3 构建 LVS Keepalived 高可用群集时 如何缩短故障中断时间 4 基于 CentOS
  • 电商高利润市场系统分析课:讲解电商赚钱机会,必看课程

    新标题 电商市场系统分析课程 揭秘电商盈利机会 值得推荐的学习资源 文章 引言 100字 电商行业成为了当今最受欢迎的盈利模式之一 但是 如何在电商市场中找到高利润市场 仍是一个颇具挑战的问题 本文将介绍一门关于电商市场系统分析的课程 该课
  • 在 vue3 中构建 SvgIcon 组件

    效果图 1 组件编写 components SvgIcon vue