IconsDialog.vue 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. <template>
  2. <div class="icon-dialog">
  3. <el-dialog
  4. v-bind="$attrs"
  5. width="980px"
  6. :modal-append-to-body="false"
  7. v-on="$listeners"
  8. @open="onOpen"
  9. @close="onClose"
  10. >
  11. <div slot="title">
  12. 选择图标
  13. <el-input
  14. v-model="key"
  15. size="mini"
  16. :style="{width: '260px'}"
  17. placeholder="请输入图标名称"
  18. prefix-icon="el-icon-search"
  19. clearable
  20. />
  21. </div>
  22. <ul class="icon-ul">
  23. <li
  24. v-for="icon in iconList"
  25. :key="icon"
  26. :class="active===icon?'active-item':''"
  27. @click="onSelect(icon)"
  28. >
  29. <i :class="icon" />
  30. <div>{{ icon }}</div>
  31. </li>
  32. </ul>
  33. </el-dialog>
  34. </div>
  35. </template>
  36. <script>
  37. import iconList from '@/utils/generator/icon.json'
  38. const originList = iconList.map(name => `el-icon-${name}`)
  39. export default {
  40. inheritAttrs: false,
  41. props: ['current'],
  42. data() {
  43. return {
  44. iconList: originList,
  45. active: null,
  46. key: ''
  47. }
  48. },
  49. watch: {
  50. key(val) {
  51. if (val) {
  52. this.iconList = originList.filter(name => name.indexOf(val) > -1)
  53. } else {
  54. this.iconList = originList
  55. }
  56. }
  57. },
  58. methods: {
  59. onOpen() {
  60. this.active = this.current
  61. this.key = ''
  62. },
  63. onClose() {},
  64. onSelect(icon) {
  65. this.active = icon
  66. this.$emit('select', icon)
  67. this.$emit('update:visible', false)
  68. }
  69. }
  70. }
  71. </script>
  72. <style lang="scss" scoped>
  73. .icon-ul {
  74. margin: 0;
  75. padding: 0;
  76. font-size: 0;
  77. li {
  78. list-style-type: none;
  79. text-align: center;
  80. font-size: 14px;
  81. display: inline-block;
  82. width: 16.66%;
  83. box-sizing: border-box;
  84. height: 108px;
  85. padding: 15px 6px 6px 6px;
  86. cursor: pointer;
  87. overflow: hidden;
  88. &:hover {
  89. background: #f2f2f2;
  90. }
  91. &.active-item{
  92. background: #e1f3fb;
  93. color: #7a6df0
  94. }
  95. > i {
  96. font-size: 30px;
  97. line-height: 50px;
  98. }
  99. }
  100. }
  101. .icon-dialog {
  102. ::v-deep .el-dialog {
  103. border-radius: 8px;
  104. margin-bottom: 0;
  105. margin-top: 4vh !important;
  106. display: flex;
  107. flex-direction: column;
  108. max-height: 92vh;
  109. overflow: hidden;
  110. box-sizing: border-box;
  111. .el-dialog__header {
  112. padding-top: 14px;
  113. }
  114. .el-dialog__body {
  115. margin: 0 20px 20px 20px;
  116. padding: 0;
  117. overflow: auto;
  118. }
  119. }
  120. }
  121. </style>