<template>
|
<div class="icon-dialog">
|
<el-dialog v-model="value" width="980px" :close-on-click-modal="false" :modal-append-to-body="false" @open="onOpen"
|
@close="onClose">
|
<template #header="{ close, titleId, titleClass }">
|
选择图标
|
<el-input v-model="key" size="small" :style="{ width: '260px' }" placeholder="请输入图标名称" prefix-icon="Search"
|
clearable />
|
</template>
|
<ul class="icon-ul">
|
<li v-for="icon in iconList" :key="icon" :class="active === icon ? 'active-item' : ''" @click="onSelect(icon)">
|
<div>
|
<el-icon :size="30">
|
<component :is="icon" />
|
</el-icon>
|
<div>{{ icon }}</div>
|
</div>
|
</li>
|
</ul>
|
</el-dialog>
|
</div>
|
</template>
|
<script setup>
|
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
|
import { watch } from 'vue'
|
|
const iconList = ref([])
|
const originList = []
|
const key = ref('')
|
const active = ref('')
|
const emit = defineEmits(['select'])
|
const value = defineModel()
|
for (const [key] of Object.entries(ElementPlusIconsVue)) {
|
iconList.value.push(key)
|
originList.push(key)
|
}
|
|
function onOpen() { }
|
function onClose() { }
|
function onSelect(icon) {
|
active.value = icon
|
emit('select', icon)
|
value.value = false
|
}
|
|
watch(key, (val) => {
|
if (val) {
|
iconList.value = originList.filter(name => name.indexOf(val) > -1)
|
} else {
|
iconList.value = originList
|
}
|
})
|
</script>
|
<style lang="scss" scoped>
|
.icon-ul {
|
margin: 0;
|
padding: 0;
|
font-size: 0;
|
|
li {
|
list-style-type: none;
|
text-align: center;
|
font-size: 14px;
|
display: inline-flex;
|
width: 16.66%;
|
box-sizing: border-box;
|
height: 108px;
|
padding: 6px 6px 6px 6px;
|
cursor: pointer;
|
overflow: hidden;
|
align-items: center;
|
justify-content: center;
|
|
&:hover {
|
background: #f2f2f2;
|
}
|
|
&.active-item {
|
background: #e1f3fb;
|
color: #7a6df0
|
}
|
|
i {
|
font-size: 30px;
|
line-height: 50px;
|
margin-bottom: 10px;
|
}
|
}
|
}
|
|
.icon-dialog {
|
:deep() {
|
.el-dialog {
|
border-radius: 8px;
|
margin-bottom: 0;
|
margin-top: 4vh !important;
|
display: flex;
|
flex-direction: column;
|
max-height: 92vh;
|
overflow: hidden;
|
box-sizing: border-box;
|
|
.el-dialog__header {
|
padding-top: 14px;
|
}
|
|
.el-dialog__body {
|
margin: 0 20px 20px 20px;
|
padding: 0;
|
overflow: auto;
|
}
|
}
|
}
|
}
|
</style>
|