• vue3中使用svg并封装成组件


    打包svg地图

    • 安装插件

      yarn add vite-plugin-svg-icons -D
      # or
      npm i vite-plugin-svg-icons -D
      # or
      pnpm install vite-plugin-svg-icons -D
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • 使用插件

      vite.config.ts

      import { VantResolver } from 'unplugin-vue-components/resolvers'
      +import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
      +import path from 'path'
      
      // https://vitejs.dev/config/
      export default defineConfig({
        plugins: [
          vue(),
          Components({
            dts: false,
            resolvers: [VantResolver({ importStyle: false })]
          }),
      +    createSvgIconsPlugin({
      +      // 指定图标文件夹,绝对路径(NODE代码)
      +      iconDirs: [path.resolve(process.cwd(), 'src/icons')]
      +    })
        ],
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
    • 导入到main

      +import 'virtual:svg-icons-register'
      
      • 1
    • 使用svg精灵地图

          <svg aria-hidden="true">
            
            <use href="#icon-login-eye-off" />
          svg>
      
      • 1
      • 2
      • 3
      • 4

      在这里插入图片描述

    小结:

    • icons文件打包的产物?
      • 会生成一个 svg 结构(js创建的)包含所有图标,理解为 精灵图
    • 怎么使用svg图标?
      • 通过 svg 标签 #icon-文件夹名称-图片名称 指定图片,理解 精灵图定位坐标

    【坑】vite-plugin-svg-icons报错:Cannot find package ‘fast-glob’

    在这里插入图片描述

    自行安装一下fast-glob依赖解决该问题

    yarn add fast-glob -D
    
    • 1

    图标组件-封装svg组件

    组件 components/CpIcon.vue

    <script setup lang="ts">
    // 提供name属性即可
    defineProps<{
      name: string
    }>()
    script>
    
    <template>
      <svg aria-hidden="true" class="cp-icon">
        <use :href="`#icon-${name}`" />
      svg>
    template>
    
    <style lang="scss" scoped>
    .cp-icon {
      // 和字体一样大
      width: 1em;
      height: 1em;
    }
    style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    如果使用了 unplugin-vue-components 默认 src/compoenents 自动导入注册;
    给组件添加类型,让写属性和事件可以有提示
    类型 types/components.d.ts

    // 1. 导入组件实例
    import CpIcon from '@/components/CpIcon.vue'
    // 2. 声明 vue 类型模块
    declare module 'vue' {
    // 3. 给 vue  添加全局组件类型,interface 和之前的合并
      interface GlobalComponents {
      // 4. 定义具体组件类型,typeof 获取到组件实例类型
      // typeof 作用是得到对应的TS类型
        CpIcon: typeof CpIcon
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    使用:

    <template>
      <cp-icon name="login-eye-off">cp-icon>
    template>
    
    • 1
    • 2
    • 3
  • 相关阅读:
    项目管理软件dhtmlxGantt配置教程(六):编辑器的类型
    MySQL的下载与安装(详细)
    AOP结合注解实现项目中接口调用情况监控
    Linux系列讲解 —— VIM配置与美化
    FFmpeg中的时间戳与时间基
    无线投屏冷知识
    【DVWA】19. Insecure CAPTCHA 不安全的验证码(全等级)
    Spring Cloud Gateway快速入门(三)——过滤器
    Elasticsearch:使用 Low Level Java 客户端来创建连接 - Elastic Stack 8.x
    【1++的C++初阶】之模板
  • 原文地址:https://blog.csdn.net/qq_40589140/article/details/134045935