zoukankan      html  css  js  c++  java
  • 在vue中使用svg

    在vue中使用svg

    • svg的好处
      • 矢量性(无论图片放多大,都不会出现锯齿状模糊)
      • 利于seo
    • 步骤
    • 1、安装依赖:
    npm install svg-sprite-loader --save-dev
    • 2、配置vue-cli
    chainWebpack(config) {
        // 配置svg
        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()
      }
    • 3、在src/components/svgIcon下新建svg组件
    <template>
      <svg :class="svgClass" aria-hidden="true" v-on="$listeners">
        <use :xlink:href="iconName"/>
      </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 {
         10em;
        height: 10em;
        vertical-align: -0.15em;
        fill: currentColor;
        overflow: hidden;
      }
    </style>
    • 4、在src下新建icons文件夹,及icons文件夹下svg文件夹、index.js文件, index.js文件内容如下
    import Vue from 'vue'
    import SvgIcon from '@/components/svg'// 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)
    • 5、在main.js中引入svg
    import './assets/icons/index'
    • 6下载svg图片将svg图片放在assets/icons/svg/下面
    • 7、在页面中使用(可以通过font-size,color来设置svg图标颜色和大小,设置color时需要将svg文件中的path下面的fill=“#xxx”去除即可)
    <div class="svg_box">
        SVG图标
        <svg-icon icon-class="smile"></svg-icon>
        <svg-icon icon-class="cry"></svg-icon>
    </div>

    在Vue3 + vite中使用svg

      由于vite的svg无法兼容vue2的版本,只能重新找如何实现,结果找了很久没有几个文章有用的要么打包警告,要么就是无法实现直接报错的,终于找到了官方文档是使用另一个插件实现的vite-plugin-svg-icons

      具体实现

    yarn add vite-plugin-svg-icons -D
    或者
    npm i vite-plugin-svg-icons -D
    

      配置插件 vite.config.js / vite.config.ts

    import viteSvgIcons from 'vite-plugin-svg-icons';
    const { resolve } = require('path')
    
    export default defineConfig({
      plugins: [ 
        vue(),
        viteSvgIcons({
          // 配置路劲在你的src里的svg存放文件
          iconDirs: [resolve(process.cwd(), 'src/assets/icons')],
          symbolId: 'icon-[dir]-[name]',
        })
      ]
    })
    

      存放文件路劲 /src/assets/icons

    src/assets/icons
    
    - icon1.svg
    - icon2.svg
    - icon3.svg
    - dir/icon1.svg
    

      然后就在main.js / main.ts 加入否则报错

    import 'vite-plugin-svg-icons/register';
    // 需要全局引入再添加
    import svgIcon from './components/SvgIcon/index.vue' // 全局svg图标组件
    app.component('svg-icon', svgIcon)
    

      SvgIcon组件实现

    <template>
      <svg :class="svgClass" aria-hidden="true">
        <use :xlink:href="iconName" :fill="color" />
      </svg>
    </template>
    
    <script lang="ts">
    import {computed, defineComponent} from 'vue'
    export default defineComponent({
      props: {
        iconClass: {
          type: String,
          required: true,
        },
        className: {
          type: String,
          default: '',
        },
        color: {
          type: String,
          default: '#889aa4',
        },
      },
      setup(props) {
        return {
          iconName: computed(() => `#icon-${props.iconClass}`),
          svgClass: computed(() => {
            if (props.className) {
              return `svg-icon ${props.className}`
            }
            return 'svg-icon'
          }),
        }
      },
    })
    </script>
    
    <style scope>
    .svg-icon {
       1em;
      height: 1em;
      fill: currentColor;
      vertical-align: middle;
    }
    </style>
    

      使用方法同Vu2

    <template>
      <div>
         <svg-icon icon-class="icon1" />
      </div>
    </template>
    
    <script>
      import { defineComponent, computed } from 'vue';
    
      import SvgIcon from './components/SvgIcon.vue';
      export default defineComponent({
        name: 'App',
        components: { SvgIcon },
      });
    </script>
    

      

  • 相关阅读:
    LeetCode 275. H-Index II
    LeetCode 274. H-Index
    LeetCode Gray Code
    LeetCode 260. Single Number III
    LeetCode Word Pattern
    LeetCode Nim Game
    LeetCode 128. Longest Consecutive Sequence
    LeetCode 208. Implement Trie (Prefix Tree)
    LeetCode 130. Surrounded Regions
    LeetCode 200. Number of Islands
  • 原文地址:https://www.cnblogs.com/gagaran/p/13684166.html
Copyright © 2011-2022 走看看