list.vue 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <template>
  2. <div class="icon-selector-warp-row">
  3. <el-scrollbar ref="selectorScrollbarRef">
  4. <el-row :gutter="10" v-if="props.list.length > 0">
  5. <el-col :xs="6" :sm="4" :md="4" :lg="4" :xl="4" v-for="(v, k) in list" :key="k" @click="onColClick(v)">
  6. <div class="icon-selector-warp-item" :class="{ 'icon-selector-active': prefix === v }">
  7. <SvgIcon :name="v" />
  8. </div>
  9. </el-col>
  10. </el-row>
  11. <el-empty :image-size="100" v-if="list.length <= 0" :description="empty"></el-empty>
  12. </el-scrollbar>
  13. </div>
  14. </template>
  15. <script setup lang="ts" name="iconSelectorList">
  16. // 定义父组件传过来的值
  17. const props = defineProps({
  18. // 图标列表数据
  19. list: {
  20. type: Array,
  21. default: () => [],
  22. },
  23. // 自定义空状态描述文字
  24. empty: {
  25. type: String,
  26. default: () => '无相关图标',
  27. },
  28. // 高亮当前选中图标
  29. prefix: {
  30. type: String,
  31. default: () => '',
  32. },
  33. });
  34. // 定义子组件向父组件传值/事件
  35. const emit = defineEmits(['get-icon']);
  36. // 当前 icon 图标点击时
  37. const onColClick = (v: unknown | string) => {
  38. emit('get-icon', v);
  39. };
  40. </script>
  41. <style scoped lang="scss">
  42. .icon-selector-warp-row {
  43. height: 230px;
  44. overflow: hidden;
  45. .el-row {
  46. padding: 15px;
  47. }
  48. .el-scrollbar__bar.is-horizontal {
  49. display: none;
  50. }
  51. .icon-selector-warp-item {
  52. display: flex;
  53. justify-content: center;
  54. align-items: center;
  55. border: 1px solid var(--el-border-color);
  56. border-radius: 5px;
  57. margin-bottom: 10px;
  58. height: 30px;
  59. i {
  60. font-size: 20px;
  61. color: var(--el-text-color-regular);
  62. }
  63. &:hover {
  64. cursor: pointer;
  65. background-color: var(--el-color-primary-light-9);
  66. border: 1px solid var(--el-color-primary-light-5);
  67. i {
  68. color: var(--el-color-primary);
  69. }
  70. }
  71. }
  72. .icon-selector-active {
  73. background-color: var(--el-color-primary-light-9);
  74. border: 1px solid var(--el-color-primary-light-5);
  75. i {
  76. color: var(--el-color-primary);
  77. }
  78. }
  79. }
  80. </style>