<!-- @author zhengjie --> <template> <div class="icon-body"> <el-input v-model="name" class="icon-search" clearable placeholder="请输入图标名称" @clear="filterIcons" @input="filterIcons"> <i slot="suffix" class="el-icon-search el-input__icon" /> </el-input> <div class="icon-list"> <div class="list-container"> <div v-for="(item, index) in iconList" class="icon-item-wrapper" :key="index" @click="selectedIcon(item)"> <div :class="['icon-item', { active: activeIcon === item }]"> <svg-icon :icon-class="item" class-name="icon" style="height: 25px;width: 16px;"/> <span>{{ item }}</span> </div> </div> </div> </div> </div> </template> <script> import icons from './requireIcons' export default { name: 'IconSelect', props: { activeIcon: { type: String } }, data() { return { name: '', iconList: icons } }, methods: { filterIcons() { this.iconList = icons if (this.name) { this.iconList = this.iconList.filter(item => item.includes(this.name)) } }, selectedIcon(name) { this.$emit('selected', name) document.body.click() }, reset() { this.name = '' this.iconList = icons } } } </script> <style rel="stylesheet/scss" lang="scss" scoped> .icon-body { width: 100%; padding: 10px; .icon-search { position: relative; margin-bottom: 5px; } .icon-list { height: 200px; overflow: auto; .list-container { display: flex; flex-wrap: wrap; .icon-item-wrapper { width: calc(100% / 3); height: 25px; line-height: 25px; cursor: pointer; display: flex; .icon-item { display: flex; max-width: 100%; height: 100%; padding: 0 5px; &:hover { background: #ececec; border-radius: 5px; } .icon { flex-shrink: 0; } span { display: inline-block; vertical-align: -0.15em; fill: currentColor; padding-left: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } } .icon-item.active { background: #ececec; border-radius: 5px; } } } } } </style>