中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

vue怎么封裝自己的Svg圖標組件庫

發布時間:2023-04-26 15:34:45 來源:億速云 閱讀:109 作者:iii 欄目:開發技術

這篇文章主要介紹了vue怎么封裝自己的Svg圖標組件庫的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇vue怎么封裝自己的Svg圖標組件庫文章都會有所收獲,下面我們一起來看看吧。

    vue封裝自己的Svg圖標組件庫

    安裝及配置方法

    一、安裝組件svg-sprite-loader

    npm install svg-sprite-loader --save-dev      ||   yarn add svg-sprite-loader

    二、在src/components下新建文件夾及文件SvgIcon/index.vue,index.vue添加如下內容:

    vue怎么封裝自己的Svg圖標組件庫

    <template>
      <div
        v-if="isExternal"
        :
        class="svg-external-icon svg-icon"
        v-on="$listeners"
      />
      <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
        <use :xlink:href="iconName" rel="external nofollow"  rel="external nofollow"  />
      </svg>
    </template>
    
    <script>
    //導入公共方法,校驗傳入的iconClass是否為外部鏈接
    //匹配http或者 https
    import { isExternal } from '@/utils/validate'
    export default {
      name: 'SvgIcon',
      props: {
        iconClass: {
          type: String,
          required: true
        },
        className: {
          type: String,
          default: ''
        }
      },
      computed: {
      //匹配http或者 https
        isExternal () {
          return isExternal(this.iconClass)
        },
        iconName () {
          return `#icon-${this.iconClass}`
        },
        svgClass () {
          if (this.className) {
            return 'svg-icon ' + this.className
          } else {
            return 'svg-icon'
          }
        },
        styleExternalIcon () {
          return {
            mask: `url(${this.iconClass}) no-repeat 50% 50%`,
            '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
          }
        }
      }
    }
    </script>
    
    <style scoped>
    .svg-icon {
      width: 1em;
      height: 1em;
      vertical-align: -0.15em;
      fill: currentColor;
      overflow: hidden;
    }
    
    .svg-external-icon {
      background-color: currentColor;
      mask-size: cover !important;
      display: inline-block;
    }
    </style>

    在src下新建utils/validate.js,定義公共的方法,用于校驗傳入的iconClass是否為外部鏈接,內容如下:

    vue怎么封裝自己的Svg圖標組件庫

    //匹配http或者 https
    export function isExternal(path) {
      return /^(https?:|mailto:|tel:)/.test(path)
    }

    三、在src下新建icons文件夾,及icons文件夾下svg文件夾、index.js文件,將svg圖片放入svg文件夾中,在 index.js文件中添加如下內容

    vue怎么封裝自己的Svg圖標組件庫

    import Vue from 'vue'
    import SvgIcon from '@/components/SvgIcon'// svg 組件
    
    // 全局注冊svg組件
    Vue.component('svg-icon', SvgIcon)
    // 工程化導入svg圖片
    const req = require.context('./svg', false, /\.svg$/)
    const requireAll = requireContext => requireContext.keys().map(requireContext)
    requireAll(req)

    四、在main.js中引入svg

    import '@/icons' // icon

    五、配置 vue.config.js(主要為打包進行設置)

    const path = require('path')
    // 將傳入的相對路徑轉換成絕對路徑
    function resolve (dir) {
      return path.join(__dirname, dir)
    }
    module.exports = {
      chainWebpack (config) {
        // set svg-sprite-loader
        config.module
          .rule('svg')
          .exclude.add(resolve('src/icons'))
          .end()
        config.module
          .rule('icons')
          .test(/\.svg$/)
          .include.add(resolve('src/icons'))
          .end()
          .use('svg-sprite-loader')
          .loader('svg-sprite-loader')
          .options({
            symbolId: 'icon-[name]'
          })
          .end()
      }
    
    }

    六、在組件中使用

     <div>
          <svg-icon icon-class="user" />//傳入svg文件名稱
          <svg-icon icon-class="password" />
        </div>

    vue怎么封裝自己的Svg圖標組件庫

    vue使用svg封裝圖標組件,代替img圖片提高性能

    可行性分析

    如何在vue中使用svg封裝圖標組件,代替img圖片提高性能。

    • 1: 配置:svg-sprite-loader

    • 2:自定義 svg-icon組件

    • 3:導出.svg模塊

    目錄介紹

    |-src  
    |-main.js  
    |-icons  
    |-svg  
    |-user.svg  
    |-psd.svg  
    |-index.js  
    |-SvgIcon.vue  
    |-vue.config.js

    說明

    為了讓字體圖標模塊成為,獨立于組件,獨立于項目的模塊

    • 1:優點:在任意的項目中都可以引用。需要什么圖標下載獨贏svg就可以了

    • 2:未完成:整個常見圖標,發布npm 提供給更多的開發者使用

    • 3: 注意:如果在組件庫中,不能使用vue.config.js 使用打包工具配置文件

    1. 使用說明

    <svg-icon iconClass="user" className="use" />  
      
    <style>  
    .use{  
    font-size:100px;  
    }  
    </style>
    屬性類型是否必填作用
    iconClassstring|必填設置使用哪個圖片,值為.svg文件名
    classNamestring|非必填自定義圖標樣式

    實踐方案

    封裝SvgIcon組件

      <template>  
      
      <svg :class="svgClass" aria-hidden="true" v-on="$listeners">  
      
          <!-- xlink:href=#dl-icon-lqz -->  
      
        <use :xlink:href="iconName" rel="external nofollow"  rel="external nofollow"  />  
      
      </svg>  
      
    </template>  
      
      
      
    <script>  
      
    export default {  
      
      name: "SvgIcon",  
      
      props: {  
      
        iconClass: {  
      
          type: String,  
      
          required: true,  
      
        },  
      
        className: {  
      
          type: String,  
      
          default: "",  
      
        },  
      
      },  
      
      computed: {  
      
        svgClass() {  
      
          if (this.className) {  
      
            return `svg-icon ${this.className}`;  
      
          }  
      
          return "svg-icon";  
      
        },  
      
        iconName() {  
      
          return `#dl-icon-${this.iconClass}`;  
      
        },  
      
      },  
      
    };  
      
    </script>  
      
      
      
    <style scoped>  
      
    .svg-icon{  
      
      width: 1em;  
      
      height: 1em;  
      
      fill: currentColor;  
      
      overflow: hidden;  
      
    }  
      
      
      
    </style>

    1. 準備好對應的svg文件

    去阿里圖標庫下載需要的svg文件,一個圖標一個svg文件并放在 src/icon/svg目錄下

    2. 配置.svg模塊

    2.1 安裝:svg-sprite-loader

    npm i svg-sprite-loader -D

    2.2 vue.config.js中配置svg-sprite-loader

    //vue.config.js  
      
    const path = require('path');  
      
    // 在vue.config.js中沒有配置 resolve 方法, 需要自定義一個  
      
    function resolve(dir) {  
      
      return path.join(__dirname, dir);  
      
    }  
      
    module.exports = {  
      
      chainWebpack: (config) => {  
      
        config.module.rules.delete('svg'); // 重點:刪除默認配置中處理svg  
      
        config.module  
      
          .rule('svg-sprite-loader') // rule 匹配規則  
      
          .test(/\.svg$/) // 用正則匹配 文件  
      
          .include  // 包含 包括  
      
          .add(resolve('src/icon')) // 處理svg目錄  
      
          .end()  
      
          .use('svg-sprite-loader')   // 配置loader  use() 使用哪個loader  
      
          .loader('svg-sprite-loader')// 加載loader  
      
          .options({  
      
            // [name] 變量。一般表示匹配到的文件名 xxx.svg  
      
            // 注意: symbolId  在  <use xlink:href="#dl-icon-svg文件名" rel="external nofollow"  />  
      
            symbolId: 'dl-icon-[name]', // 將所有的.svg 集成到 symbol中,當使用 類名 icon-文件名  
      
          });  
      
      },  
      
    };

    3. 導出所有.svg 注冊組件

    // index.js  
      
    // 引入vue  
      
    import Vue from 'vue';  
      
    // 引入svgIcon組件  
      
    import SvgIcon from './SvgIcon.vue';  
      
    // 注冊為全局組件  
      
    Vue.component('svg-icon', SvgIcon);  
      
    // 引入當前svg目錄下的文件、不遍歷子目錄、匹配以'.svg'為結尾的文件  
      
    /**  
      
     * webpack 是模塊化打包工具  
      
     * require.context()  返回上下文構造函數webpackContext。存放了所有匹配到的模塊信息  
      
     * 參一:設置配置模塊目錄  
      
     * 參二:表示是否匹配子目錄 true 匹配 false 不匹配  
      
     * 參三:正則, 匹配文件的正則表達式。  
      
     *  
      
     * webpackContext.keys() 返回所有匹配到模塊的文件地址 【集合】  
      
     */  
      
    const webpackContext = require.context('./svg', false, /\.svg$/);  
      
      
      
    // // 相當于 req.keys().forEach(key => req(key)), req.keys()是匹配到的svg文件的路徑數組  
      
    const requireAll = (requireContext) => {  
      
        // requireContext.keys()   匹配的 文件路徑數組  
      
        return requireContext.keys().map(requireContext)  
      
    };  
      
    // // 得到一個完整解析的module數組  
      
    requireAll(webpackContext);  
      
      
      
    // 實現:webpackApi方式自動化導入模塊,代替 import...from方式```

    運行icon/index.js

    // msin.js  
    import '@/icon/inde.js'

    接下來就可以使用 svg-icon圖標組件了

    關于“vue怎么封裝自己的Svg圖標組件庫”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“vue怎么封裝自己的Svg圖標組件庫”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    巴南区| 九江县| 绥滨县| 六枝特区| 紫金县| 凤山县| 新蔡县| 顺平县| 东乌珠穆沁旗| 宿松县| 寻甸| 沁阳市| 孟连| 化德县| 遂溪县| 吉木萨尔县| 荥阳市| 思南县| 类乌齐县| 霍邱县| 商丘市| 赫章县| 剑河县| 丹巴县| 沙洋县| 苍溪县| 涟源市| 丰顺县| 芦溪县| 永宁县| 克拉玛依市| 满城县| 西畴县| 保康县| 抚宁县| 喜德县| 庆安县| 大厂| 泰顺县| 海兴县| 孟津县|