zoukankan      html  css  js  c++  java
  • Vue 使用 vue-svg-icon 插件实现 svg 按需加载

    一、svg 在网页中的一般用法

    svg 使用 XML 格式定义图像,基本使用如下:

    <body> 
      <svg width="50" height="50" version="1.1" xmlns="http://www.w3.org/2000/svg"> 
        <rect width="100%" height="100%" style="fill:red;stroke-1;stroke:rgba(0,0,0,1)"/> 
      </svg> 
    </body>

    二、在 Vue 中使用 svg

    可以通过上述的一般用法在 Vue 中直接使用 svg,但既然已经是用 Vue来组件化开发项目了,那么在组件中穿插着一大段的 svg 也显得过于杂乱;

    这里可以通过 svg 的 use 标签,将 svg 的一大段绘制代码封装在 symbol 中,然后通过 use 调用。

    例如,将所有绘制 svg 的代码放到 svg-icon.vue 文件中,所有图标的绘制代码使用 symbol 标签分隔开并单独命名,然后将这个文件当做组件导出,在主页面中引入此组件,接着在需要使用 svg 图标的地方通过 use 标签将其引入,

    svg-icon.vue 代码示例如下:

    <template> 
    <svg 
      xmlns="http://www.w3.org/2000/svg" 
      xmlnsXlink="http://www.w3.org/1999/xlink" 
      style={{position:'absolute',0,height:0}}> 
      <defs> 
        <symbol viewBox="0 0 26 31" id="location"> 
          <path xmlns="http://www.w3.org/2000/svg" d="M512.571517 65.907059c-204.736964 0-370.715183 165.979242-370.715183 370.724393 0 94.440929 35.320437 180.625824 93.462648 246.083651 1.572822 2.690272 3.50994 5.225001 5.817496 7.531534l240.297878 251.597225c1.279133 1.864464 2.736321 3.64297 4.393054 5.298679 2.111081 2.111081 4.418636 3.90596 6.856152 5.402033 14.458293 10.06524 34.491559 8.658194 47.393403-4.242627 3.26537-3.263323 5.78782-6.987135 7.582699-10.960633L783.610536 690.24766c1.867534-1.866511 3.489474-3.88447 4.876054-6.010901 58.951647-65.640999 94.819552-152.431691 94.819552-247.604284C883.305119 231.886301 717.325877 65.907059 512.571517 65.907059zM512.390391 588.611865c-82.734306 0-149.814074-67.087954-149.814074-149.842727 0-82.753749 67.079768-149.833517 149.814074-149.833517 82.772168 0 149.851936 67.079768 149.851936 149.833517C662.242328 521.523911 595.161536 588.611865 512.390391 588.611865z" fill="#d81e06"/> 
        </symbol> 
      </defs> 
     </svg> 
    </template>

    这里将整个 vue 组件导出一个大的 svg,此 svg 中包含了许多小图标,类似于精灵图,每个图标使用 symbol 分隔,并单独命名以方便调用。

     在 index.vue 中使用示例:

    ... 
    <svg class="location-icon"> 
      <use xlink:href="#location"></use> 
    </svg> 
    ...

    不过还有个问题,如果当一个页面需要用到的 svg 图标很多,势必就造成 svg-icon.vue 这个文件非常大,当另一个页面只需要用到其中一个 svg 图标时,就需要把包含几百个图标的 svg 组件加载进去,明显不太友好;
    最好是能够实现按需加载,当前页面需要哪些图标就加载哪些。

    三、通过 vue-svg-icon 插件实现按需加载

    1、安装

    npm install vue-svg-icon --save-dev

    2、在项目的 main.js 入口引入 vue-svg-icon 以便全局调用:

    import Icon from 'vue-svg-icon/Icon.vue';
    Vue.component('icon', Icon); 

    3、将 svg 图标文件放入 src/svg/

    图标文件可以到 iconfont 上下载

    4、在组件中按需加载需要的图标

    例如 pen.svg 放到了 /src/svg 目录中,在 vue 组件按需加载:

    <template> 
      <icon name="pen" scale="1"></icon> 
    </template>

    这里可以通过修改 scale 属性值或在使用的页面中修改 svg 样式来调整图标大小

  • 相关阅读:
    luogu CF804D Expected diameter of a tree |Tarjan+樹的直徑+前綴和+二分查找
    luogu CF25C Roads in Berland |最短路floyd
    自觉日志·1·再现曾经的自觉
    祝福您新年快乐!
    自觉体验十一 体验祝福,与弘誓大愿!
    自觉体验 十 体验失忆
    自觉体验 六 手语与结印
    自觉体验 一  闲来无事,闭目养神
    我将离开屏幕前的“      ”
    第五章  自觉与【转载】《大念处经》
  • 原文地址:https://www.cnblogs.com/Leophen/p/13201907.html
Copyright © 2011-2022 走看看