index.vue 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. <template>
  2. <div class="icon-body">
  3. <el-input
  4. v-model="iconName"
  5. style="position: relative;"
  6. clearable
  7. placeholder="请输入图标名称"
  8. @clear="filterIcons"
  9. @input="filterIcons"
  10. >
  11. <template #suffix><i class="el-icon-search el-input__icon" /></template>
  12. </el-input>
  13. <div class="icon-list">
  14. <div v-for="(item, index) in iconList" :key="index" @click="selectedIcon(item)">
  15. <i :class="'iconfont icon-' + item" style="position: relative;top:-6px"></i>
  16. <!-- <svg-icon :icon-class="item" style="height: 30px;width: 16px;" /> -->
  17. <span>{{ item }}</span>
  18. </div>
  19. </div>
  20. </div>
  21. </template>
  22. <script setup>
  23. import icons from './requireIcons'
  24. import iconfont from '/src/assets/icons/iconfont/iconfont.css'
  25. let iconArr = iconfont.match(/(?:[\.]{1})([a-zA-Z_]+[\w-_]*)(?:[\s\.\,\{\>#\:]{0})/igm)
  26. iconArr.splice(0,4)
  27. iconArr = iconArr.map(item => {
  28. return item.substring(6,item.length)
  29. })
  30. const iconName = ref('');
  31. const iconList = ref(iconArr);
  32. const emit = defineEmits(['selected']);
  33. function filterIcons() {
  34. iconList.value = iconArr
  35. if (iconName.value) {
  36. iconList.value = iconArr.filter(item => item.indexOf(iconName.value) !== -1)
  37. }
  38. }
  39. function selectedIcon(name) {
  40. emit('selected', name)
  41. document.body.click()
  42. }
  43. function reset() {
  44. iconName.value = ''
  45. iconList.value = iconArr
  46. }
  47. defineExpose({
  48. reset
  49. })
  50. </script>
  51. <style lang='scss' scoped>
  52. .icon-body {
  53. width: 100%;
  54. padding: 10px;
  55. .icon-list {
  56. height: 200px;
  57. overflow-y: scroll;
  58. div {
  59. height: 30px;
  60. line-height: 30px;
  61. margin-bottom: -5px;
  62. cursor: pointer;
  63. width: 33%;
  64. float: left;
  65. }
  66. span {
  67. display: inline-block;
  68. vertical-align: -0.15em;
  69. fill: currentColor;
  70. overflow: hidden;
  71. }
  72. }
  73. }
  74. </style>