Vue中引入svg图标的两种方式


Posted in Vue.js onJanuary 14, 2021

Vue中引入svg图标的方式

Vue中引入svg图标的方式一

安装

yarn add svg-sprite-loader --dev

svg组件

Vue中引入svg图标的两种方式

index.vue

<!-- svg组件 -->
<template>
 <svg class="svg-icon" :class="svgClass" aria-hidden="true">
  <use :xlink:href="iconName" />
 </svg>
</template>

<script>
export default {
 name: 'SvgIcon',
 props: {
  // svg 的名称
  svgName: {
   type: String,
   required: true
  }
 },
 computed: {
  iconName () {
   return `#icon-${this.svgName}`
  },
  svgClass () {
   if (this.svgName) {
    return 'svg-icon' + this.svgName
   } else {
    return 'svg-icon'
   }
  }
 }
}
</script>

<style lang="less" scoped>
.svg-icon {
 width: 100px;
 height: 100px;
 vertical-align: -0.15em;
 fill: currentColor;
 overflow: hidden;
}
</style>

注册到全局

Vue中引入svg图标的两种方式

index.js

import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'

// 注册到全局
Vue.component('svg-icon', SvgIcon)

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

vue.config.js

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

页面中使用

<!-- svg-name为svg名 -->
<svg-icon svg-name="ic_home_news" />

Vue中引入svg图标的方式二

npm install svg-sprite-loader --save-dev

vue.config.js中添加如下代码

const path = require('path');
function resolve(dir) {
 // __dirname项目根目录的绝对路径
 return path.join(__dirname, dir);
}
module.exports = {
 chainWebpack: config => {
 const svgRule = config.module.rule('svg');
 // 清除已有的所有loader
 // 如果你不这样做,接下来的loader会附加在该规则现有的loader之后
 svgRule.uses.clear();
 svgRule
  .test(/\.svg$/)
  .include.add(path.resolve(__dirname, './src/icons/svg'))
  .end()
  .use('svg-sprite-loader')
  .loader('svg-sprite-loader')
  .options({
  symbolId: 'icon-[name]'
  });
 const fileRule = config.module.rule('file');
 fileRule.uses.clear();
 fileRule
  .test(/\.svg$/)
  .exclude.add(path.resolve(__dirname, './src/icons/svg'))
  .end()
  .use('file-loader')
  .loader('file-loader');
 },
}

建立如下的文件目录

Vue中引入svg图标的两种方式

SvgIcon.vue代码

<template>
 <svg :class="svgClass" xmlns="http://www.w3.org/2000/svg">
 <use :xlink:href="iconName" xmlns:xlink="http://www.w3.org/1999/xlink" />
 </svg>
</template>
<script>
export default {
 name: 'SvgIcon',
 props: {
 iconClass: {
  type: String,
  required: true
 },
 className: {
  type: String,
  default: ''
 }
 },
 computed: {
 iconName() {
  return `#icon-${this.iconClass}`;
 },
 svgClass() {
  if (this.className) {
  return 'svg-icon ' + this.className;
  } else {
  return 'svg-icon';
  }
 }
 }
};
</script>
<style scoped>
.svg-icon {
 width: 1em;
 height: 1em;
 vertical-align: -0.15em;
 fill: currentColor;
 overflow: hidden;
}
</style>

svg文件夹下放svg图标

index.js代码

import Vue from 'vue';
import SvgIcon from '@/components/SvgIcon'; // svg组件
// register globally
Vue.component('svg-icon', SvgIcon);
const req = require.context('./svg', false, /\.svg$/);
const requireAll = requireContext => requireContext.keys().map(requireContext);
requireAll(req);

最后在main.js中引入

import './icons';

在页面中使用svg

icon-class是svg图标名 class-name是你要自定义的class类名

<svg-icon icon-class="features_ic_risk@1x" class-name="icon"></svg-icon>

总结

到此这篇关于Vue中引入svg图标的两种方式的文章就介绍到这了,更多相关Vue引入svg图标内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Vue.js 相关文章推荐
vue打开其他项目页面并传入数据详解
Nov 25 Vue.js
Vue如何实现验证码输入交互
Dec 07 Vue.js
Vue实现指令式动态追加小球动画组件的步骤
Dec 18 Vue.js
vue 通过base64实现图片下载功能
Dec 19 Vue.js
vue实现购物车的小练习
Dec 21 Vue.js
Vue项目中使用mock.js的完整步骤
Jan 12 Vue.js
Vue常用API、高级API的相关总结
Feb 02 Vue.js
Vue如何实现组件间通信
May 15 Vue.js
Vue + iView实现Excel上传功能的完整代码
Jun 22 Vue.js
Vue+Flask实现图片传输功能
Apr 01 Vue.js
vue实现列表拖拽排序的示例代码
Apr 08 Vue.js
分享一个vue实现的记事本功能案例
Apr 11 Vue.js
vue+element table表格实现动态列筛选的示例代码
Jan 14 #Vue.js
vue 递归组件的简单使用示例
Jan 14 #Vue.js
vue element和nuxt的使用技巧分享
Jan 14 #Vue.js
vue动态设置路由权限的主要思路
Jan 13 #Vue.js
vue组件是如何解析及渲染的?
Jan 13 #Vue.js
vue实现一个获取按键展示快捷键效果的Input组件
Jan 13 #Vue.js
vue使用vue-quill-editor富文本编辑器且将图片上传到服务器的功能
Jan 13 #Vue.js
You might like
PHP中的integer类型使用分析
2010/07/27 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
Laravel统计一段时间间隔的数据方法
2019/10/09 PHP
扩展jQuery 键盘事件的几个基本方法
2009/10/30 Javascript
jQuery+jqmodal弹出窗口实现代码分明
2010/06/14 Javascript
javascript 45种缓动效果 非常酷
2011/06/28 Javascript
jquery判断元素的子元素是否存在的示例代码
2014/02/04 Javascript
使用js画图之画切线
2015/01/12 Javascript
详解Bootstrap的iCheck插件checkbox和radio
2016/08/24 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
2016/10/20 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
Nodejs 发送Post请求功能(发短信验证码例子)
2017/02/09 NodeJs
使用Nodejs连接mongodb数据库的实现代码
2017/08/21 NodeJs
利用JS如何计算字符串所占字节数示例代码
2017/09/13 Javascript
vue计算属性和监听器实例解析
2018/05/10 Javascript
easy_install python包安装管理工具介绍
2013/02/10 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
python实现列表的排序方法分享
2019/07/01 Python
Python如何实现的二分查找算法
2020/05/27 Python
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
Html5原生拖拽相关事件简介以及基础实现
2020/11/19 HTML / CSS
JD Sports瑞典:英国领先的运动时尚商店
2018/01/28 全球购物
美国领先的水果篮送货公司和新鲜水果供应商:The Fruit Company
2018/02/13 全球购物
英国最大的滑板品牌选择:Route One
2019/09/22 全球购物
意大利时尚奢侈品店:D’Aniello Boutique
2021/01/19 全球购物
武汉高蓝德国际.net机试
2016/06/24 面试题
护理中职生求职信范文
2014/02/24 职场文书
北京申奥口号
2014/06/19 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
毕业生个人自荐书
2015/03/05 职场文书
优秀党员主要事迹材料
2015/11/04 职场文书
2016年员工政治思想表现评语
2015/12/02 职场文书
李清照的诗词赏析(20首)
2019/08/22 职场文书
Python提取PDF指定内容并生成新文件
2021/06/09 Python
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS