103 lines
2.6 KiB
Vue
Raw Normal View History

2024-10-26 22:40:52 +08:00
<template>
<a-modal v-model:visible="visible" width="70vw" :top="'50px'" :align-center="false" :footer="false">
<template #title> 请选择图标 </template>
<a-input
:style="{
width: '100%',
marginBottom: '14px'
}"
placeholder="请输入关键词搜索"
allow-clear
v-model="searchName"
>
<template #prefix>
<icon-search />
</template>
</a-input>
<div class="over-scroll">
<div class="icon-grid">
<div v-for="item in iconList" :key="item" class="grid-item" @click="onIcon(item)">
<component :is="item" :size="30"></component>
<span>{{ item }}</span>
</div>
</div>
<div v-if="iconList.length === 0" class="empty-row">
<a-empty>
<template #image>
<icon-exclamation-circle-fill />
</template>
<span>未查询到您要找的图标</span>
</a-empty>
</div>
</div>
</a-modal>
</template>
<script setup lang="ts">
import * as ArcoIcons from "@arco-design/web-vue/es/icon";
const emit = defineEmits(["select"]);
const searchName = ref<string>("");
const iconList = computed(() => {
if (!ArcoIcons) return [];
let icons: string[] = [];
for (let key in ArcoIcons) {
2024-10-26 22:48:11 +08:00
if (key != "default") icons.push(key);
2024-10-26 22:40:52 +08:00
}
2024-10-26 22:48:11 +08:00
// 若按照关键字搜索,则返回搜索结果
2024-10-26 22:40:52 +08:00
if (searchName.value) {
return icons.filter(item => item.toLowerCase().includes(searchName.value.toLowerCase()));
}
2024-10-26 22:48:11 +08:00
// 若关键字为空则返回全部列表
2024-10-26 22:40:52 +08:00
return icons;
});
2024-10-26 22:48:11 +08:00
const onIcon = (iconName: string) => {
2024-10-26 22:40:52 +08:00
visible.value = false;
2024-10-26 22:48:11 +08:00
emit("select", iconName);
2024-10-26 22:40:52 +08:00
};
2024-10-27 14:59:43 +08:00
const visible = ref<boolean>(false);
2024-10-26 22:40:52 +08:00
const open = () => {
searchName.value = "";
visible.value = true;
};
defineExpose({
open
});
</script>
<style lang="scss" scoped>
.over-scroll {
max-height: 70vh;
overflow: auto;
.icon-grid {
overflow: hidden;
display: grid;
grid-template-columns: repeat(auto-fill, 150px); /* 自适应填充列,每列宽为 150px */
justify-content: space-evenly; /* 水平均匀分配列之间的空隙 */
.grid-item {
height: 100px;
display: flex;
flex-direction: column;
row-gap: $margin;
align-items: center;
justify-content: center;
transition: transform 0.2s ease-in-out; /* 添加过渡效果 */
&:hover {
transform: scale(1.3); /* 鼠标移入时放大到 1.3 倍 */
}
}
}
}
.empty-row {
width: 100%;
height: 300px;
display: flex;
justify-content: center;
align-items: center;
}
</style>