Two ways to introduce svg icons in Vue

Two ways to introduce svg icons in Vue

How to introduce svg icons in Vue

Method 1 of introducing svg icon in Vue

Install

yarn add svg-sprite-loader --dev

svg component

index.vue

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

<script>
export default {
 name: 'SvgIcon',
 props: {
  // svg name 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>

Register to the global

index.js

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

// Register to the global 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()
	}  
}

Used in the page

<!-- svg-name is the svg name-->
<svg-icon svg-name="ic_home_news" />

Method 2 of introducing svg icon in Vue

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

Add the following code to vue.config.js

const path = require('path');
function resolve(dir) {
 // __dirname absolute path of the project root directory return path.join(__dirname, dir);
}
module.exports = {
 chainWebpack: config => {
 const svgRule = config.module.rule('svg');
 // Clear all existing loaders
 // If you don't do this, subsequent loaders will be appended after the existing loaders for this rule 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');
 },
}

Create the following file directory

SvgIcon.vue code

<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 folder to place svg icon

index.js code

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

Finally, introduce it in main.js

import './icons'; 

Using SVG in the page

icon-class is the svg icon name class-name is the class name you want to customize

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

Summarize

This concludes this article about two ways to introduce svg icons in Vue. For more relevant content about introducing svg icons in Vue, please search for previous articles on 123WORDPRESS.COM or continue to browse the following related articles. I hope you will support 123WORDPRESS.COM in the future!

You may also be interested in:
  • How to write SVG icon components in Vue
  • Teach you how to use svg icons in vue projects

<<:  Example code for implementing dynamic column filtering in vue+element table

>>:  How to use HTML 5 drag and drop API in Vue

Recommend

JavaScript offsetParent case study

1. Definition of offsetParent: offsetParent is th...

Detailed process of drawing three-dimensional arrow lines using three.js

Demand: This demand is an urgent need! In a subwa...

The past two years with user experience

<br />It has been no more than two years sin...

Comprehensive analysis of isolation levels in MySQL

When the database concurrently adds, deletes, and...

503 service unavailable error solution explanation

1. When you open the web page, 503 service unavai...

Security configuration and detection of SSL after the website enables https

It is standard for websites to enable SSL nowaday...

MySQL 8.0.20 winx64 installation and configuration method graphic tutorial

This article shares with you the installation and...

About MySQL innodb_autoinc_lock_mode

The innodb_autoinc_lock_mode parameter controls t...

The process of SSH service based on key authentication in Linux system

As we all know, SSH is currently the most reliabl...

Common properties of frameset (dividing frames and windows)

A frame is a web page screen divided into several ...

Vue implements tree table

This article example shares the specific code of ...

Examples of using the ES6 spread operator

Table of contents What are spread and rest operat...

Analysis of Mysql data migration methods and tools

This article mainly introduces the analysis of My...