如何在项目中轻松实现高效的IconPicker图标选择功能
IconPicker图标选择,折腾了半天终于搞定
最近在做一个项目,需要一个图标选择器(IconPicker),让用户可以方便地选择和使用图标。一开始我以为这很简单,毕竟网上现成的库一大堆,结果没想到踩了不少坑。
刚开始直接用现成库,结果发现一堆问题
首先我找了个看起来挺火的库,按照文档配置了一下,结果发现图标加载速度特别慢,而且样式也不太符合我的需求。折腾了半天发现,这个库的默认样式和我项目的整体风格不太搭,改起来也挺麻烦。
后来试了下另一个库,发现虽然图标加载快了,但是功能上又有些欠缺,比如搜索图标、分组管理这些都没有。我又花了一天时间去研究怎么扩展功能,结果发现这个库的API文档写得一塌糊涂,很多地方根本没解释清楚。
自己动手丰衣足食,自定义IconPicker
最后决定自己动手撸一个简单的IconPicker组件。其实核心需求就那么几个:显示图标列表、支持搜索、支持分组展示。这里我踩了个坑,开始以为直接用CSS和HTML就能搞定,结果发现性能问题还挺严重的。
下面是我的实现过程:
核心代码就这几行
首先,我用了Vue来构建这个组件,因为项目本身也是基于Vue的,这样可以更好地集成。下面是组件的核心代码:
<template>
<div class="icon-picker">
<input type="text" v-model="searchTerm" placeholder="搜索图标" />
<div class="icon-list">
<div v-for="(group, groupName) in filteredIcons" :key="groupName" class="icon-group">
<h3>{{ groupName }}</h3>
<div class="icons">
<div v-for="icon in group" :key="icon.name" class="icon-item" @click="selectIcon(icon)">
<i :class="icon.className"></i>
<span>{{ icon.name }}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
data() {
return {
searchTerm: '',
icons: {
'基础图标': [
{ name: 'home', className: 'fas fa-home' },
{ name: 'user', className: 'fas fa-user' }
],
'社交图标': [
{ name: 'facebook', className: 'fab fa-facebook' },
{ name: 'twitter', className: 'fab fa-twitter' }
]
}
};
},
computed: {
filteredIcons() {
if (this.searchTerm === '') {
return this.icons;
}
const filtered = {};
for (const groupName in this.icons) {
const group = this.icons[groupName];
const filteredGroup = group.filter(icon => icon.name.includes(this.searchTerm));
if (filteredGroup.length > 0) {
filtered[groupName] = filteredGroup;
}
}
return filtered;
}
},
methods: {
selectIcon(icon) {
// 这里可以添加选中图标的逻辑
console.log('Selected Icon:', icon);
}
}
};
</script>
<style scoped>
.icon-picker {
width: 300px;
padding: 10px;
border: 1px solid #ccc;
}
.icon-list .icon-group {
margin-top: 10px;
}
.icon-list .icons {
display: flex;
flex-wrap: wrap;
}
.icon-list .icon-item {
display: flex;
align-items: center;
margin: 5px;
cursor: pointer;
}
.icon-list .icon-item i {
margin-right: 5px;
}
</style>
技术细节和原理
这个组件的核心逻辑其实很简单,就是通过v-for循环来渲染图标列表,并且根据searchTerm来过滤显示的图标。这里我用了一个计算属性filteredIcons来处理搜索逻辑,这样可以让模板更简洁。
样式方面,我用了Flexbox布局来让图标列表自适应排列,这样在不同屏幕尺寸下都能正常显示。每个图标项(icon-item)都包含一个图标和一个名称,点击时会触发selectIcon方法,你可以在这里添加更多的逻辑,比如把选中的图标传递给父组件。
小问题和优化
虽然这个组件已经能满足基本需求了,但还有一些小问题需要优化。比如搜索功能目前是简单的字符串匹配,如果图标名字比较长或者有特殊字符,可能会有问题。还有就是样式的可配置性不够高,如果要修改样式还需要手动改CSS。
这些问题以后再慢慢解决吧,目前这个方案已经够用了。
以上是我踩坑后的总结
以上就是我在实现IconPicker图标选择器过程中遇到的一些问题和解决方案。如果你有更好的方案或者有什么建议,欢迎在评论区交流。希望这篇文章能对你有所帮助!

暂无评论