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>
    

      

  • 相关阅读:
    upc组队赛1 黑暗意志【stl-map】
    upc组队赛1 闪闪发光 【优先队列】
    upc组队赛1 流连人间的苏苏
    POJ 2387 Til the Cows Come Home 【最短路SPFA】
    POJ 2421 Constructing Roads 【最小生成树Kruscal】
    qrcode-使用
    submlie 配置php运行
    composer 安装laravel
    composer 配置镜像
    Laravel-队列
  • 原文地址:https://www.cnblogs.com/gagaran/p/13684166.html
Copyright © 2011-2022 走看看