vue项目中使用svg

这篇具有很好参考价值的文章主要介绍了vue项目中使用svg。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

一般html中使用svg图片是用img标签使用,这在项目中就相对来说非常麻烦。出现大量使用svg情况就变的比较麻烦

<img src="../assets/svgs/car.svg" />

封装

将svg文件统一放一个文件夹下 src/assets/svgs

需要2步

为文件打包

安装开发依赖

npm i svg-sprite-loader -D

打包配置

....
chainWebpack: config => {
    config.module
      .rule('svg')
      .exclude.add(resolve('src/assets/svgs'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/assets/svgs'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()
  },
....

...
const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  chainWebpack: (config) => {
    const svgRule = config.module.rule('svg')
    svgRule.uses.clear()
    // 添加要替换的 loader
    svgRule.use('svg-sprite-loader')
           .loader('svg-sprite-loader')
           .options({symbolId: 'icon-[name]'})
  }
  })
  ...

为开发

封装VSvg.vue

<template>
    <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
    <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
        <use :xlink:href="iconName" />
    </svg>
</template>

<script>
import { isExternal, importAll } from '@/utils/util'

importAll(require.context('@/assets/svgs', false, /\.svg$/))

export default {
  name: 'VSvg',
  props: {
    icon: {
      type: String,
      required: true
    },
    className: {
      type: String,
      default: ''
    }
  },
  computed: {
    isExternal () {
      return isExternal(this.icon)
    },
    iconName () {
      return `#icon-${this.icon}`
    },
    svgClass () {
      if (this.className) {
        return 'svg-icon ' + this.className
      } else {
        return 'svg-icon'
      }
    },
    styleExternalIcon () {
      return {
        mask: `url(${this.icon}) no-repeat 50% 50%`,
        '-webkit-mask': `url(${this.icon}) no-repeat 50% 50%`
      }
    }
  }
}

</script>

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

.svg-external-icon {
    background-color: currentColor;
    mask-size: cover !important;
    display: inline-block;
}
</style>

util.js

export function isExternal (path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

export function importAll (requireContext) {
  requireContext.keys().forEach(requireContext)
}

关于require.context方法

核心就是使用了webpack内置的require.context方法
详细参数解释点击这里官网传送门

require.context(
  directory, //这里指存放svg文件目录的路径
  (useSubdirectories = true), //是否还搜索其子目录,默认为true
  (regExp = /^\.\/.*$/), //正则匹配文件类型, 这里我们匹配 .svg 结尾的文件 /\.svg$/
  (mode = 'sync') //模式,默认同步
);

main中注册

import VSvg from  '@/components/base/VSvg.vue'
import Vue from 'vue'
 Vue.component('v-svg', VSvg)

由于此处我注册的组件较多,而且都在一个文件里面文章来源地址https://www.toymoban.com/news/detail-717480.html

const registerGlobal = (Vue) => {
  const requireComponent = require.context(
    '@/components/base', true, /\.vue$/
  )
  console.log('学习', requireComponent)
  requireComponent.keys().forEach(fileName => {
    const componentConfig = requireComponent(fileName)
    const Component = componentConfig.default || componentConfig
    const componentName = kebabCase(fileName.replace(/^\.\//, '').replace(/\.\w+$/, ''))
    if (typeof Component.install === 'function') {
      Vue.use(Component)
    } else {
      Vue.component(componentName, Component)
    }
  })

  Vue.directive('perm', hasPerm)

  Vue.filter('dayjs', (val, formatter = 'YYYY-MM-DD HH:MM:ss') => dayjs(val).format(formatter))
}

组件使用

  <v-svg icon="zoom-out" />

到了这里,关于vue项目中使用svg的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【前端】vue.js从入门到项目实战笔记

    【前端目录贴】 文本插值中的代码被解释为节点的文本内容,而HTML插值中的代码则被渲染为视图节点。 3.1.1 文本插值 文本插值的方式:用 双大括号 将要绑定的变量、值、表达式括住就可以实现,Vue将会 获取计算后的值 ,并以 文本的形式 将其展示出来。 结果: 3.1.2 HTM

    2024年01月21日
    浏览(50)
  • svg.js使用教程

    在日常web开发过程中,我们会需要显示一些图形化的元素,使用div+css、ps图片是常见的实现方式。 但使用svg来绘制可能更加合适,SVG是 可缩放矢量图形 ,有一些预定义的形状元素,可被开发者使用和操作: 矩形(rect)、 圆形(circle)、 椭圆(ellipse)、 线(line)、 折线(polyline)、 多

    2024年02月06日
    浏览(35)
  • vue3创建项目报错Vue.js - The Progressive JavaScript Framework TypeError: (0 , import_node_ut

    报错信息: Vue.js - The Progressive JavaScript Framework TypeError: (0 , import_node_util.parseArgs) is not a function     at init (C:UsersAdministratorAppDataLocalnpm-cache_npx2f7e7bff16d1c534node_modulescreate-vueoutfile.cjs:4481:72)     at Object.anonymous (C:UsersAdministratorAppDataLocalnpm-cache_npx2f7e7bff16d1c534node_module

    2024年04月10日
    浏览(145)
  • Vue.js 3 项目开发:迈向现代化前端开发的必经之路

    随着前端技术的不断发展,Vue.js作为一种轻量级的JavaScript框架,已经逐渐成为了前端开发者的首选。Vue.js 3有哪些新特性、优势以及如何高效地进行项目开发呢? Vue.js是一种用于构建用户界面的渐进式框架。它的核心库专注于视图层,易于与其他库或现有项目集成。Vue.js 3是

    2024年01月23日
    浏览(50)
  • 小白详解Vue3项目中怎么引入 SVG 图标

    今天一淘模板给大家来详解Vue3项目中怎么引入 SVG 图标具体流程 SVG 图标 既然是页面,肯定离不开一些图标 icon ,所以肯定要去最全的 阿里图标库 来寻找 这里讲解下如何将 阿里图标库 里面的东西,放到我们的页面上 阿里图标库 进入页面,找到 资源管理 下面的 我的

    2024年02月09日
    浏览(39)
  • 前端项目部署自动检测更新后通知用户刷新页面(前端实现,技术框架vue、js、webpack)——方案一:编译项目时动态生成一个记录版本号的文件

    当我们重新部署前端项目的时候,如果用户一直停留在页面上并未刷新使用,会存在功能使用差异性的问题,因此,当前端部署项目后,需要提醒用户有去重新加载页面。 vue、js、webpack 编译项目时动态生成一个记录版本号的文件 轮询(20s、自己设定时间)这个文件,判断版

    2024年02月02日
    浏览(61)
  • 前端项目中使用js-beautify格式化、美化js代码

    很多网站的js,html,css代码做了混淆处理,导致难以阅读,这个时候js-beautify工具就可以派上用场了。github地址:https://github.com/beautify-web/js-beautify 可以在这个网站看转换效果:https://www.1tool.site/#/javascript?id=1 效果如图:

    2024年02月15日
    浏览(49)
  • 在前端开发中,何时应该使用 jQuery,何时应该使用 Vue.js

    如果您是最近才开始进入 Web 前端开发领域的开发人员,那么您可能会听说过 jQuery。jQuery 是一个小巧而功能强大的 JavaScript 库,旨在简化跨浏览器 DOM 操作、事件处理、动画效果和 AJAX 等方面的操作,可以让开发人员更轻松地开发出高质量的网站和 Web 应用程序。 何时应该使

    2024年02月02日
    浏览(48)
  • 初学前端-记使用阿里图库SVG图标不显示的解决方法

    使用VUE3+Element-Plus做来制作前端界面,做到左侧菜单栏时遇到了一个困难,添加的SVG图标始终不显示,位置存在,图标的信息也没有问题,但是就是一直显示不出来。  后经多方搜索, 经vue前端项目引入iconfont阿里图标的四种方式_飞歌Fly的博客-CSDN博客的提示在Main.js中导入了

    2024年01月25日
    浏览(68)
  • vue全局使用svg

    1、安装依赖 2、配置选项 在 vue.config.js 的 chainWebpack 里配置下面代码 解释:config.module.rule是一个方法,用来获取某个对象的规则。.exclude.add(文件a)是往禁用组添加文件a,就是对文件a进行禁用。.test(/.svg$/)是匹配到.svg结尾的文件 3、定义组件 把svg封装成组件,我们就可以以

    2023年04月18日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包