返回顶部
首页 > 资讯 > 前端开发 > JavaScript >图文详解如何在vue3+vite项目中使用svg
  • 884
分享到

图文详解如何在vue3+vite项目中使用svg

2024-04-02 19:04:59 884人浏览 独家记忆
摘要

今天在vue3+vite项目练习中,在使用svg时,发现之前的写法不能用,之前的使用方法参考Vue2中优雅的使用svg const req = require.context('

今天在vue3+vite项目练习中,在使用svg时,发现之前的写法不能用,之前的使用方法参考Vue2中优雅的使用svg


const req = require.context('./icons/svg', false, /\.svg$/)
const requireAll = requireContent => requireContent.keys().map(requireContent)
requireAll(req)

然后就各种资料查找,终于实现了,废话不多说,直接上代码:

stept1: 文件目录

stept2: 安装 svg-sprite-loader


npm install svg-sprite-loader -D
# via yarn
yarn add svg-sprite-loader -D

stept3: 创建svgIcon.vue文件


   <template>
  <svg :class="svGClass" v-bind="$attrs" :style="{color: color}">
    <use :xlink:href="iconName" rel="external nofollow" />
  </svg>
</template>

<script setup>


import { defineProps, computed } from "vue";

const props = defineProps({
  name: {
      type: String,
      required: true
    },
    color: {
      type: String,
      default: ''
    }
})

const iconName = computed(()=>`#icon-${props.name}`);
const svgClass = computed(()=> {
  console.log(props.name, 'props.name');
  if (props.name) {
        return `svg-icon icon-${props.name}`
      }
      return 'svg-icon'
});
</script>

<style lang='sCSS'>
.svg-icon {
  width: 1em;
  height: 1em;
  fill: currentColor;
  vertical-align: middle;
}
</style>

stept4: 创建icons文件夹,存放svg文件

stept5: 在main.js里面全局注入svg-icon组件


import { createApp } from 'vue'
import App from './App.vue'

import svgIcon from './components/svgIcon.vue'

createApp(App).component('svg-icon', svgIcon).mount('#app');

stept6: 在plugins文件夹创建svgBuilder.js(重点来了), ts版本参考:https://GitHub.com/JetBrains/svg-sprite-loader/issues/434


import { readFileSync, readdirSync } from 'fs'

let idPerfix = ''
const svgTitle = /<svg([^>+].*?)>/
const clearHeightWidth = /(width|height)="([^>+].*?)"/g

const hasViewBox = /(viewBox="[^>+].*?")/g

const clearReturn = /(\r)|(\n)/g

function findSvgFile(dir) {
  const svgRes = []
  const dirents = readdirSync(dir, {
    withFileTypes: true
  })
  for (const dirent of dirents) {
    if (dirent.isDirectory()) {
      svgRes.push(...findSvgFile(dir + dirent.name + '/'))
    } else {
      const svg = readFileSync(dir + dirent.name)
        .toString()
        .replace(clearReturn, '')
        .replace(svgTitle, ($1, $2) => {
          // console.log(++i)
          // console.log(dirent.name)
          let width = 0
          let height = 0
          let content = $2.replace(
            clearHeightWidth,
            (s1, s2, s3) => {
              if (s2 === 'width') {
                width = s3
              } else if (s2 === 'height') {
                height = s3
              }
              return ''
            }
          )
          if (!hasViewBox.test($2)) {
            content += `viewBox="0 0 ${width} ${height}"`
          }
          return `<symbol id="${idPerfix}-${dirent.name.replace(
            '.svg',
            ''
          )}" ${content}>`
        })
        .replace('</svg>', '</symbol>')
      svgRes.push(svg)
    }
  }
  return svgRes
}

export const svgBuilder = (path, perfix = 'icon') => {
  if (path === '') return
  idPerfix = perfix
  const res = findSvgFile(path)
  // console.log(res.length)
  // const res = []
  return {
    name: 'svg-transfORM',
    transformIndexhtml(html) {
      return html.replace(
        '<body>',
        `
          <body>
            <svg xmlns="Http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="position: absolute; width: 0; height: 0">
              ${res.join('')}
            </svg>
        `
      )
    }
  }
}

stept7: 最后在vite.config.js修改配置


import { svgBuilder } from './src/plugins/svgBuilder'; 

export default defineConfig({
  plugins: [svgBuilder('./src/icons/svg/')] // 这里已经将src/icons/svg/下的svg全部导入,无需再单独导入
})

总结

到此这篇关于如何在vue3+vite项目中使用svg的文章就介绍到这了,更多相关vue3+vite使用svg内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 图文详解如何在vue3+vite项目中使用svg

本文链接: https://lsjlt.com/news/157067.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 图文详解如何在vue3+vite项目中使用svg
    今天在vue3+vite项目练习中,在使用svg时,发现之前的写法不能用,之前的使用方法参考vue2中优雅的使用svg const req = require.context('...
    99+
    2024-04-02
  • vue3+vite中如何使用svg图标
    这篇“vue3+vite中如何使用svg图标”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“vue3+vite中如何使用svg...
    99+
    2023-06-30
  • Vue3中级指南之如何在vite中使用svg图标详解
    目录前言vite-plugin-svg-icons安装使用如何在组件中使用创建SvgIcon组件icons目录结构全局注册组件页面使用获取所有 SymbolId总结前言 svg图片在...
    99+
    2024-04-02
  • 如何使用vite搭建vue3项目详解
    目录一:npm构建二:更改http://localhost:3000/到8080与Network路由访问三:配置vite别名(npm install @types/node --sa...
    99+
    2024-04-02
  • 一文详解如何在Vue3+Vite中使用JSX
    目录JSX介绍在 Vue3 中使用 JSX安装插件(@vitejs/plugin-vue-jsx)新建 jsx 文件语法补充知识:注意事项总结JSX介绍 JSX(JavaScript...
    99+
    2023-02-16
    vue3 vite使用jsx vue3+vite 前端 vite搭建vue3
  • 在React、Vue项目中如何使用SVG
    这篇文章将为大家详细讲解有关在React、Vue项目中如何使用SVG,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在一些现代的扁平化设计网站,特别是移动端网站,经常会包含...
    99+
    2024-04-02
  • 如何在Vue3.0 项目中使用TypeScript 和 Vite
    如何在Vue3.0 项目中使用TypeScript 和 Vite?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Vue的优点Vue具体轻量级框架、简单易学、双向数据绑定、组件...
    99+
    2023-06-06
  • 在vue3项目中如何使用新版高德地图
    这篇文章主要讲解了“在vue3项目中如何使用新版高德地图”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“在vue3项目中如何使用新版高德地图”吧!1. 首先你要注册好账号登录2. 获取key和...
    99+
    2023-07-05
  • Vue3+Vite项目如何使用mockjs随机模拟数据
    今天小编给大家分享一下Vue3+Vite项目如何使用mockjs随机模拟数据的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在...
    99+
    2023-07-05
  • 详解如何在Vue3+TS的项目中使用NProgress进度条
    目录写在前面 在项目中安装 简单的封装 在Vue切换路由时展示进度条写在前面 NProgress是一个轻量级的进度条组件,在Github上已经2.4万star数了,虽然这个组件已经好...
    99+
    2024-04-02
  • 详解Vue3+Vite中怎么使用JSX
    虽然 jsx 最早是由 React 引入,但实际上 JSX 语法并没有定义运行时语义,并且能被编译成各种不同的输出形式。如果你之前使用过 JSX 语法,那么请注意 Vue 的 JSX 编译方式与 React 中 JSX 的编译方式不同,因此...
    99+
    2023-05-14
    Vue vue3 vite JSX
  • vue3+vite中如何使用import.meta.glob
    前言: 在vue2的时候,我们一般引入多个js或者其他文件,一般使用 require.context 来引入多个不同的文件,但是vite中是不支持 require的,他推出了一个类似的功能,就是用import.meta.gl...
    99+
    2023-05-14
    Vue3 vite import.meta.glob
  • Vue3+Vite中如何使用JSX
    这篇文章主要介绍“Vue3+Vite中如何使用JSX”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue3+Vite中如何使用JSX”文章能帮助大家解决问题。JSX介绍JSX(JavaScript ...
    99+
    2023-07-04
  • vue3+vite中如何使用vuex
    本篇内容主要讲解“vue3+vite中如何使用vuex”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue3+vite中如何使用vuex”吧!具体步骤:安装vuex( vue3建议 4.0+ )...
    99+
    2023-07-04
  • 使用Vite+Vue3+Vant全家桶快速构建项目步骤详解
    目录引言一、vue3全家桶模板介绍1.版本依赖2.全家桶内置集成二、安装 tive-cli 命令行工具三、生成项目四、项目体验引言 随着Vue3 和 Vite 版本的不断更新完善,开...
    99+
    2024-04-02
  • 在Vue3项目中使用如何echarts问题
    目录一,创建 Vue3 项目并安装 echarts二,创建数据可视化组件(一)组件内容(二)使用组件(三)程序解释三,响应式刷新更多功能可扩展总结记得第一次使用 echarts 还是...
    99+
    2023-05-19
    Vue3使用echarts Vue3项目中echarts Vue3项目中使用echarts
  • 教你在vue项目中使用svg图标的方法
    svg图标优点 svg与iconfont之类的字体图标在网页中的使用差别不大,可以修改大小,颜色等而且不失真。 安装svg-sprite-loader npm install --s...
    99+
    2024-04-02
  • 一文详解如何在Vue3中使用jsx/tsx
    目录JSX 如何用插值条件渲染(v-if)列表循环(v-for)事件绑定事件修饰符v-model插槽最后我们都知道,通常情况下我们使用 vue 大多都是用的 SFC(Signle F...
    99+
    2023-03-23
    Vue3使用jsx/tsx Vue3 jsx/tsx Vue jsx tsx
  • vue3-pinia-ts项目中的使用示例详解
     store.ts import { defineStore } from "pinia"; import { GlobalState, ThemeConfigProp }...
    99+
    2022-11-13
    vue3-pinia-ts使用 vue3-pinia-ts项目使用
  • vue3项目中引入ts的详细图文教程
    目录1.基于脚手架的情况下创建 vue3项目2.启动未引入ts的vue3项目3.在页面中(HomeView.vue)引入ts4.配置vue3+ts项目5.其他配置6.在HomeVie...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作