如何在项目中轻松实现高效的IconPicker图标选择功能

UX-志玉 组件 阅读 2,113
赞 45 收藏
二维码
手机扫码查看
反馈

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图标选择器过程中遇到的一些问题和解决方案。如果你有更好的方案或者有什么建议,欢迎在评论区交流。希望这篇文章能对你有所帮助!

本文章不代表JZTHEME立场,仅为作者个人观点 / 研究心得 / 经验分享,旨在交流探讨,供读者参考。
发表评论

暂无评论