美文网首页
vue使用svg

vue使用svg

作者: autumn_3d55 | 来源:发表于2022-03-22 17:19 被阅读0次

    在vue中使用svg

    • svg的好处
      矢量性(无论图片放多大,都不会出现锯齿状模糊)
      利于seo

    1. 安装依赖

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

    2. 配置 vue-cli

    • 需要在根目录下创建 vue.config.vue 文件
    • vue.config.vue
    • 注意:exclude.add(resolve('src/icons')) //对应下面配置svg的路径
    const path = require('path') //必须引入
    const resolve = dir => path.join(__dirname, dir)//必须引入
    module.exports = {
      //配置代理
      devServer: {},
      // 配置svg
      chainWebpack: config => {
        config.module
        .rule('svg')
        .exclude.add(resolve('src/icons')) //对应下面配置svg的路径
        .end();
    
        config.module
        .rule('icons')
        .test(/\.svg$/)
        .include.add(resolve('src/icons')) //对应下面配置svg的路径
        .end()
        .use('svg-sprite-loader')
        .loader('svg-sprite-loader')
        .options({
          symbolId: 'icon-[name]'
        });
      },
    }
    

    3. 在src/components/svgIcon下新建index.bue组件

    • index.vue
    <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 {
        width: 10em;
        height: 10em;
        vertical-align: -0.15em;
        fill: currentColor;
        overflow: hidden;
      }
    </style>
    

    4. 在src下新建icons文件夹,及icons文件夹下svg文件夹、index.js文件

    image.png
    • svg文件夹存放 svg

    • index.js 文件如下

    import Vue from 'vue'
    import SvgIcon from '@/components/svgIcon/index'// 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 Vue from 'vue'
    import App from './App.vue'
    
    //引入svg
    import './icons'
    
    Vue.config.productionTip = false
    
    new Vue({
      render: h => h(App),
    }).$mount('#app')
    
    

    6. 在组件中使用

    使用格式 <svg-icon icon-class="首页" className="icon"></svg-icon>
    icon-class: 对应svg名字
    className:自定义class名,修改样式

    • 注意:如果要自定义颜色,需要在 '首页.svg' 搜索fill, 然后删除 fill="#1296db",按 ctrl+f 可以快速搜索。

      image.png
    • app.vue

    <template>
      <div id="app">
        <svg-icon icon-class="首页" className="icon"></svg-icon>
      </div>
    </template>
    
    <script>
    
    export default {
      name: 'App',
    }
    </script>
    
    <style lang="less">
    #app {
      .icon {
        // 需要删除 .svg 里面的fill
        color: red;
        width: 50px;
        height: 50px;
      }
    }
    </style>
    

    7.使用svg遇到问题

    Syntax Error: Error: Cannot find module 'url-slug'
    本人第一次使用,出现问题,不知道是不是因为我选择了vue2的原因,百度找到了一些方法

    • 运行命令,看到(y/n),选择y
    vue add svg-sprite
    
    • 最后,会多安装两个依赖:svgo,svgo-loader


      image.png

    8. 最后

    有问题希望大家及时指出。

    相关文章

      网友评论

          本文标题:vue使用svg

          本文链接:https://www.haomeiwen.com/subject/wmwfjrtx.html