封装组件IconSelect

举报
林太白 发表于 2025/07/28 10:38:46 2025/07/28
【摘要】 封装组件IconSelect

封装组件IconSelect

1、IconSelect作用

// vite-plugin-svg-icons地址
https://github.com/vbenjs/vite-plugin-svg-icons

这部分组件主要是为了我们菜单之中进行icon选择的时候帮助我们渲染菜单的icon

2、封装组件IconSelect

🍎requireIcons.ts导入所有的icon


const icons: string[] = []
const modules = import.meta.glob('./../../assets/icons/svg/*.svg');
for (const path in modules) {
  // 这里 p 是 string
  const p: string = path.split('assets/icons/svg/')[1].split('.svg')[0]
  icons.push(p)
}
export default icons

🍎IconSelect/index.vue中封装

<template>
  <div class="icon-body">
    <el-input
      v-model="iconName"
      class="icon-search"
      clearable
      placeholder="请输入图标名称"
      @clear="filterIcons"
      @input="filterIcons"
    >
      <template #suffix><i class="el-icon-search el-input__icon"/></template>
    </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 }]">
            <SvgIcon :name="item" class-name="icon" style="height: 25px;width: 16px;"/>
            <span>{{ item }}</span>
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script setup>
import icons from './requireIcons'

const props = defineProps({
  activeIcon: {
    type: String
  }
})

const iconName = ref('')
const iconList = ref(icons)
const emit = defineEmits(['selected'])

function filterIcons() {
  iconList.value = icons
  if (iconName.value) {
    iconList.value = icons.filter(item => item.indexOf(iconName.value) !== -1)
  }
}

function selectedIcon(name) {
  emit('selected', name)
  document.body.click()
}

function reset() {
  iconName.value = ''
  iconList.value = icons
}

defineExpose({
  reset
})
</script>

<style scoped>
  .icon-body {
  width: 100%;
  padding: 10px;
}
.icon-body .icon-search {
  position: relative;
  margin-bottom: 5px;
}
.icon-body .icon-list {
  height: 200px;
  overflow: auto;
}
.icon-body .icon-list .list-container {
  display: flex;
  flex-wrap: wrap;
}
.icon-body .icon-list .list-container .icon-item-wrapper {
  width: calc(100% / 3);
  height: 25px;
  line-height: 25px;
  cursor: pointer;
  display: flex;
}
.icon-body .icon-list .list-container .icon-item-wrapper .icon-item {
  display: flex;
  max-width: 100%;
  height: 100%;
  padding: 0 5px;
}
.icon-body .icon-list .list-container .icon-item-wrapper .icon-item:hover {
  background: #ececec;
  border-radius: 5px;
}
.icon-body .icon-list .list-container .icon-item-wrapper .icon-item .icon {
  flex-shrink: 0;
}
.icon-body .icon-list .list-container .icon-item-wrapper .icon-item span {
  display: inline-block;
  vertical-align: -0.15em;
  fill: currentColor;
  padding-left: 2px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.icon-body .icon-list .list-container .icon-item-wrapper .icon-item.active {
  background: #ececec;
  border-radius: 5px;
}
</style>

3、使用

IconSelect主要用于我们菜单里面选择icon部分,效果

 <IconSelect 
   ref="iconSelectRef" 
   @selected="selected" 
  :active-icon="form.icon">
</IconSelect>


const iconSelectRef = ref(null);
/** 选择图标 */
function selected(name) {
 form.value.icon = name;
}

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。