• vue.js3.2.20: 使用svg(svg-sprite-loader@6.0.9)


    一,安装svg-sprite-loader

    liuhongdi@lhdpc:/data/vue/svgdemo$ npm install svg-sprite-loader --save-dev
     
    added 47 packages in 11s
     
    14 packages are looking for funding
      run `npm fund` for details

    说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectforest

             对应的源码可以访问这里获取: https://github.com/liuhongdi/
             或: https://gitee.com/liuhongdi

    说明:作者:刘宏缔 邮箱: 371125307@qq.com 

    二,创建访问svg的类

    1,创建svgIcon目录,并在其下创建svg目录: 如图:
    2,user.svg
    <svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>
    3, svgIcon/index.js
    //导入svgIcon/svg下的所有svg文件
    const requireAll = requireContext => requireContext.keys().map(requireContext);
    /*
     第一个参数是:'./svg' => 需要检索的目录,
     第二个参数是:false => 是否检索子目录,
     第三个参数是: /.svg$/ => 匹配文件的正则
    */
    const req = require.context("./svg", false, /.svg$/);
    requireAll(req);
    4, svgIcon/index.vue
    <template>
      <svg :class="svgClass" v-bind="$attrs" :style="{color: color}">
        <use :xlink:href="iconName"/>
      </svg>
    </template>
    
    <script setup>
    import { defineProps, computed } from "vue";
    const props = defineProps({
      name: {
        type: String,
        required: true
      },
      color: {
        type: String,
        default: ''
      }
    })
    
    const iconName = computed(()=>`#icon-${props.name}`);
    const svgClass = computed(()=> {
      console.log(props.name, 'props.name');
      if (props.name) {
        return `svg-icon icon-${props.name}`
      }
      return 'svg-icon'
    });
    </script>
    <style scoped>
    .svg-icon {
      width: 1em;
      height: 1em;
      fill: currentColor;
      vertical-align: middle;
    }
    </style>
    5,main.js
    import { createApp } from 'vue'
    import App from './App.vue'
    
    import "@/svgIcon/index"
    import svgIcon from "@/svgIcon/index.vue";
    
    
    createApp(App).component("svg-icon", svgIcon).mount('#app')

    三,配置vue.config.js使支持访问svg

    vue.config.js
     module.exports = {
                chainWebpack: config => {
                    const svgRule = config.module.rule("svg");
                    svgRule.uses.clear();
                    svgRule
                        .use("svg-sprite-loader")
                        .loader("svg-sprite-loader")
                        .options({
                            symbolId: "icon-[name]"
                        });
                }
    }

    四,测试效果:

    五,查看版本

    1,查看loader的版本
    liuhongdi@lhdpc:/data/vue/svgdemo$ npm list svg-sprite-loader
    svgdemo@0.1.0 /data/vue/svgdemo
    └── svg-sprite-loader@6.0.9
    2,查看vue的版本:
    liuhongdi@lhdpc:/data/vue/svgdemo$ npm list vue
    svgdemo@0.1.0 /data/vue/svgdemo
    ├─┬ @vue/cli-plugin-babel@4.5.14
    │ └─┬ @vue/babel-preset-app@4.5.14
    │   └── vue@3.2.20 deduped
    └── vue@3.2.20 
  • 相关阅读:
    NOIP2016 天天爱跑步 正解
    NOIP2016 换教室
    iOS开发-14款状态栏(StatusBar)开源软件
    iOS 优化方案浅析
    iOS应用程序多语言本地化解决方案
    iOS开发流程总结
    iOS开发者必备:四款后端服务工具
    iOS开发之加载、滑动翻阅大量图片优化解决方案
    iOS开发之──传感器使用
    iOS开发中的Html解析方法
  • 原文地址:https://www.cnblogs.com/architectforest/p/15421853.html
Copyright © 2020-2023  润新知