按部就班VUE+Element 前端應用開發(11)--- 圖標的維護和使用

在VUE+Element 前端應用中,圖標是必不可少點綴界面的元素,所以整合一些經常使用的圖標是很是必要的,還好Element界面組件裏面提供了不少常見的圖標,不過數量不是不少,應該是300個左右吧,所以考慮擴展更多圖標,我引入了vue-awesome組件,它利用了Font Awesome的內置圖標,實現了更多圖標的整合,能夠在項目中使用更多的圖標元素了,另外在本隨筆的圖標管理中,提供了對圖標名稱進行搜索,並根據圖標顏色樣式生成對應圖標的代碼,很是方便使用。html

Vue-Awesome 是基於 Vue.js 的 SVG 圖標組件,內置圖標來自  Font Awesome前端

本篇隨筆先來上一個圖標管理的界面效果,而後在逐一進行介紹Element內置圖標和Vue-Awesome的圖標吧。vue

Element圖標管理界面以下:html5

基於Vue-Awesome的圖標管理以下所示。node

其中查詢提供了名稱進行圖標查詢,以及限制一次性展現多少個,另外提供一個自定義顏色選項,從而能夠改變圖標的展現顏色。webpack

  

一、Vue-Awesome的使用介紹

  Vue-Awesome 的 npm的安裝命令以下所示:git

npm install vue-awesome

安裝方式以下所示github

import Vue from 'vue'

/* 在下面兩種方式中任選一種 */

// 僅引入用到的圖標以減少打包體積
import 'vue-awesome/icons/flag'

// 或者在不關心打包體積時一次引入所有圖標
import 'vue-awesome/icons'

/* 任選一種註冊組件的方式 */

import Icon from 'vue-awesome/components/Icon'

// 全局註冊(在 `main .js` 文件中)
Vue.component('v-icon', Icon)

// 或局部註冊(在組件文件中)
export default {
  components: {
    'v-icon': Icon
  }
}

界面使用代碼以下所示,詳細Demo能夠參考https://justineo.github.io/vue-awesome/demo/ 瞭解。web

<!-- 基礎用法 -->
<v-icon name="beer"/>

<!-- 添加選項 -->
<v-icon name="sync" scale="2" spin/>
<v-icon name="comment" flip="horizontal"/>
<v-icon name="code-branch" label="Forked Repository"/>

<!-- 堆疊圖標 -->
<v-icon label="No Photos">
  <v-icon name="camera"/>
  <v-icon name="ban" scale="2" class="alert"/>
</v-icon>

Vue-Awesome圖標提供了一些prop的屬性設置,參考下面列表所示。npm

  • name: string

    圖標名稱。若是本組件沒有用做圖標堆棧的容器,那麼這個字段是必須的。全部合法的值都對應於圖標文件相對於 icons 目錄的路徑。請注意當你在 FontAwesome 官網查找到圖標名詞後,須要確認一下圖標集的名稱。好比,在 500px 這個圖標的詳情頁會有一個 URL 參數 style=brands,故圖標名稱就是 brands/500px

    默認狀況下,只能使用 FontAwesome 的免費圖標,另外因爲 solid 樣式中的圖標最多,咱們將其設爲了默認圖標集,因此路徑前綴能夠省略。

    當傳入 null 時,整個組件將不會渲染。

  • scale: number|string

    用來調整圖標尺寸,默認值爲 1

  • spin: boolean

    用來指定圖標是否須要旋轉。默認值爲 false。(不能與 pulse 一同使用。)

  • pulse: boolean

    用來指定圖標是否有脈衝旋轉的效果。默認值爲 false。(不能與 spin 一同使用。)

  • inverse: boolean

    爲 true 時圖標顏色將被設置爲 #fff。默認值爲 false

  • flip: 'vertical'|'horizontal'|'both'

    用來指定圖標是否須要翻轉。

  • label: string

    當指定時會設置圖標的 aria-label

  • title: string

    爲圖標設置標題。

另外,咱們也能夠註冊自定義圖標,以下所示。

import Icon from 'vue-awesome/components/Icon'

Icon.register({
  baidu: {
    width: 23.868,
    height: 26,
    d: 'M3.613 13.701c2.827-.608 2.442-3.986 2.357-4.725-.138-1.139-1.477-3.128-3.296-2.971C.386 6.21.052 9.515.052 9.515c-.309 1.528.74 4.793 3.561 4.186zm3.002 5.875c-.083.238-.268.846-.107 1.375.315 1.187 1.346 1.24 1.346 1.24h1.48v-3.619H7.749c-.713.213-1.057.767-1.134 1.004zM8.86 8.035c1.562 0 2.823-1.797 2.823-4.019C11.683 1.796 10.421 0 8.86 0 7.301 0 6.036 1.796 6.036 4.016c0 2.222 1.265 4.019 2.824 4.019zm6.724.265c2.087.271 3.429-1.956 3.695-3.644.272-1.686-1.074-3.644-2.552-3.98-1.48-.339-3.329 2.032-3.497 3.578-.2 1.89.271 3.778 2.354 4.046zm5.114 9.923s-3.229-2.498-5.113-5.198c-2.555-3.981-6.185-2.361-7.399-.337-1.209 2.024-3.093 3.305-3.36 3.644-.271.334-3.9 2.293-3.095 5.871.806 3.576 3.635 3.508 3.635 3.508s2.085.205 4.504-.336c2.42-.537 4.503.134 4.503.134s5.652 1.893 7.199-1.751c1.545-3.645-.874-5.535-.874-5.535zm-9.671 5.423H7.352c-1.587-.316-2.219-1.4-2.299-1.584-.078-.188-.528-1.059-.29-2.539.686-2.219 2.642-2.379 2.642-2.379h1.956V14.74l1.666.025v8.881zm6.844-.025h-4.229c-1.639-.423-1.716-1.587-1.716-1.587v-4.677l1.716-.027v4.203c.104.447.661.529.661.529h1.742v-4.705h1.825v6.264zm5.986-12.486c0-.808-.671-3.239-3.159-3.239-2.492 0-2.825 2.295-2.825 3.917 0 1.548.131 3.71 3.227 3.641 3.096-.068 2.757-3.507 2.757-4.319z'
  }
})

若是你的 SVG 文件有多個路徑或多邊形,以及/或者你想預約義一些樣式,能夠用以下方式進行註冊:

路徑方式:

import Icon from 'vue-awesome/components/Icon'

Icon.register({
  webpack: {
    width: 1200,
    height: 1200,
    paths: [
      {
        style: 'fill:#8ED6FB',
        d: 'M1035.6 879.3l-418.1 236.5V931.6L878 788.3l157.6 91zm28.6-25.9V358.8l-153 88.3V765l153 88.4zm-901.5 25.9l418.1 236.5V931.6L320.3 788.3l-157.6 91zm-28.6-25.9V358.8l153 88.3V765l-153 88.4zM152 326.8L580.8 84.2v178.1L306.1 413.4l-2.1 1.2-152-87.8zm894.3 0L617.5 84.2v178.1l274.7 151.1 2.1 1.2 152-87.8z'
      },
      {
        style: 'fill:#1C78C0',
        d: 'M580.8 889.7l-257-141.3v-280l257 148.4v272.9zm36.7 0l257-141.3v-280l-257 148.4v272.9zm-18.3-283.6zM341.2 436l258-141.9 258 141.9-258 149-258-149z'
      }
    ]
  }
})

多邊形方式:

import Icon from 'vue-awesome/components/Icon'
Icon.register({
  vue: {
    width: 256,
    height: 221,
    polygons: [
      {
        style: 'fill:#41B883',
        points: '0,0 128,220.8 256,0 204.8,0 128,132.48 50.56,0 0,0'
      },
      {
        style: 'fill:#35495E',
        points: '50.56,0 128,133.12 204.8,0 157.44,0 128,51.2 97.92,0 50.56,0'
      }
    ]
  }
})

對於自定義的這些圖標,咱們能夠把它們一塊兒放在一個獨立的JS文件裏面進行定義,而後全局統一加入便可。

 

 使用上和其餘的圖標沒有差別,只是名稱不一樣而已。

    <div style="height:100px;padding:10px">
      <span>vue-Awesome 自定義圖標:(在utils/awesome-icon-customed.js中引入)</span>
      <v-icon name="baidu" scale="2" :style="iconStyle" />
      <v-icon name="vue" scale="2" />
      <v-icon name="webpack" scale="2" spin />
      <v-icon name="html5-c" scale="2" spin />
    </div>

 

二、導入Element 圖標和Vue-Awesome圖標

在咱們進行頁面管理的時候,咱們須要提取Element 圖標和Vue-Awesome圖標,以便可以進行界面的展現處理。

Element圖標,咱們只須要在一個JS文件裏面,包含它的名稱進去一個列表裏面便可,以下定義所示。

const elementIcons = [
  'platform-eleme', 'eleme', 'delete-solid', 'delete', ..........
]

export default elementIcons

在其中錄入對應Element的圖表名稱,移除el-icon-的前綴便可構成所需列表的每項內容。

而對於Vue-Awesome圖標,咱們安裝對應的組件後,它的圖標資源確定也必定下載下來了,咱們找到對應的node_modules 目錄下的文件就能夠看到了,以下截圖所示。

 能夠看到它的每一個圖標對應一個js文件,並且不一樣樣式還有不一樣的目錄的,咱們只須要自動加入對應的文件名稱便可。

定義一個js文件,如vue-awesome-icon.js,用來獲取對應Awesome圖標名稱,以下邏輯所示 

// Vue-Awesome圖標自動加入
const req = require.context('vue-awesome/icons', true, /\.js$/)
const requireAll = requireContext => requireContext.keys()

const re = /\.\/(.*)\.js/

const vueAwesomeIcons = requireAll(req).filter((key) => {
  return key.indexOf('index.js') < 0
}).map(i => {
  return i.match(re)[1]
})

export default vueAwesomeIcons

經過 require.context 的操做以及僅需filter的數組過濾,咱們就能夠得到對應的Awesome圖標名稱了。

在管理頁面裏面,咱們須要引入Element和Vue-Awesome的圖標管理文件,以下所示。

import elementIcons from './element-icons' // 引入Element圖標
import vueAwesomeIcons from './vue-awesome-icons' // 引入vue-awesome圖標

而後構造頁面的data數據,以下所示,其中searchForm 是用來承載查詢條件的。

export default {
  name: 'Icons',
  data() {
    return {
      // 查詢表單
      searchForm: {
        label: '',
        pagesize: 50,
        color: '#409EFF'
      },
      // 自定義svg圖標集合
      svgIcons,
      // element圖標集合
      elementIcons,
      // vueAwesome圖標集合
      vueAwesomeIcons
    }
  },

而後增長几個Computed函數,用來處理數據的過濾查詢等操做。

 computed: {
    iconStyle: function() {
      return { color: this.searchForm.color }
    },
    elementIconsFiltered: function() {
      const that = this
      var list = that.elementIcons.filter(item => {
        return item.indexOf(that.searchForm.label) >= 0
      })
      if (that.searchForm.pagesize > 0) {
        return list.slice(0, that.searchForm.pagesize)
      } else {
        return list
      }
    },
    vueAwesomeIconsFiltered: function() {
      const that = this
      var list = that.vueAwesomeIcons.filter(item => {
        return item.indexOf(that.searchForm.label) >= 0
      })
      if (that.searchForm.pagesize > 0) {
        return list.slice(0, that.searchForm.pagesize)
      } else {
        return list
      }
    }
  },

而後在method裏面,對常規的圖標進行生成處理便可。

  methods: {
    generateElementIconCode(symbol) {
      return `<i class="el-icon-${symbol}" style="color:${this.searchForm.color};"/>`
    },
    generateAwesomeIconCode(symbol) {
      return `<v-icon name="${symbol}" style="color:${this.searchForm.color};"/>`
    },
    handleClipboard(text, event) {
      if (text) {
        clipboard(text, event)
      }
    }
  }

對於界面的展現,咱們以Vue-awesome圖標展現爲例介紹,以下所示。

      <el-tab-pane label="Vue-Awesome 圖標">
        <div
          v-for="item of vueAwesomeIconsFiltered"
          :key="item"
          @click="handleClipboard(generateAwesomeIconCode(item),$event)"
        >
          <el-tooltip placement="top">
            <div slot="content">{{ generateAwesomeIconCode(item) }}</div>
            <div class="icon-item">
              <v-icon :name="item" scale="2" :style="iconStyle" />
              <span>{{ item }}</span>
            </div>
          </el-tooltip>
        </div>
      </el-tab-pane>

這樣就能夠實現對應圖標的動態過濾和展現了。

 

 

列出一下前面幾篇隨筆的鏈接,供參考:

按部就班VUE+Element 前端應用開發(1)--- 開發環境的準備工做

按部就班VUE+Element 前端應用開發(2)--- Vuex中的API、Store和View的使用

按部就班VUE+Element 前端應用開發(3)--- 動態菜單和路由的關聯處理

按部就班VUE+Element 前端應用開發(4)--- 獲取後端數據及產品信息頁面的處理

按部就班VUE+Element 前端應用開發(5)--- 表格列表頁面的查詢,列表展現和字段轉義處理

按部就班VUE+Element 前端應用開發(6)--- 常規Element 界面組件的使用

按部就班VUE+Element 前端應用開發(7)--- 介紹一些常規的JS處理函數

按部就班VUE+Element 前端應用開發(8)--- 樹列表組件的使用

按部就班VUE+Element 前端應用開發(9)--- 界面語言國際化的處理

相關文章
相關標籤/搜索