DataFilter - 也许是最好用的筛选组件(想法)

2,921 阅读4分钟

作者: [蒋璇](github.com/Jiang-Xuan

blog 授权: creativecommons.org/licenses/by…

DataFilter 是一个 [React](reactjs.org/ 组件, 汇聚多种表单组件, 参考多家的交互, 致力于成为最全面, 最好用的筛选项组件🎖. 目前组件处于 alpha 状态🎰.

动机

最初的动机是为了解决复杂的筛选项太占用空间, 而且低效的键盘支持, 冗余的视觉干扰, 贴一张图片, 我相信大多数的管理后台, 甚至是数据库产品的前台都会见过.

图上的痛点有这几个:

  • 筛选项的填写过程中, 需要不断的鼠标和键盘的切换, 无法用键盘完成筛选项, 如果键盘可以快速完成筛选, 可以一定的提升筛选效率

  • 对于空间的占用, 可能只需要一个筛选, 但是却需要占用这么多的空间

  • 需要控制每一个筛选项的宽度, 无法自适应宽度

  • 筛选项无法复制, 想要将当前的筛选项复制给同事? 不好意思, 口口相传吧

如何解决

一种比较落后的解决办法是:

这种解决办法没有从根本上解决问题, 只是解决了空间占用的问题, 而且解决的还不完美. 并且引入了需要鼠标 折叠/展开 的多余操作.

在大厂的对于复杂筛选项中, 几乎每家解决方案都类似, 采用一个输入框, 然后用一种特殊的搜索语法来解决筛选项过于复杂的问题, 例如:

linode 管理后台

github 的 issue 搜索语法

个人非常喜欢这种简洁的筛选方式, 视觉干扰很低, 但是还是存在一些问题, linode 的控制台代码是开源的, 但是支持的筛选项有限, github 的筛选组件不支持选择, 全字符输入对于普通用户有一定的难度, 并且不开源😉, 目前负责的项目用到的筛选项类型有:

  1. number 类型

  2. select 类型

  3. string 类型

  4. Autocomplete 类型

  5. DateRange 类型

  6. TreeSelect 类型

  7. ... 还有一些不太通用的类型

可以看到, 几乎是用到了所有的通用表单组件. 目前的想法是将这些组件全部放到一个输入框下, 希望拥有最简洁的操作, 最健壮的代码, 所以一定是高代码覆盖率, 充分的的测试.

原型

上面都是扯淡, 给出想法不够, 还需要给出原型, 说明一定的可实现性.

string 类型

这是目前已经在业务线管理后台上线的效果, 还有很多功能点没有开发完成, 作为了 future.

整个交互流程为:

  1. 用户点击输入框, 首先进入筛选项的 选择态

  2. ArrowUp(上箭头按键), ArrowDown(下箭头按键) 移动筛选项, Enter(回车键) 确定筛选项, 进入筛选项的 输入态

  3. 键入一些筛选项的值, 按下 Space(空格键) 来提交输入, 进入下一个筛选项的 选择态

  4. 当输入了一部分筛选项时想要触发搜索, 按下 ArrowUp(上箭头按键) 直到退出筛选项的 选择态, 进入 等待搜索态

  5. 按下 Enter(回车键) 确认搜索, 发起搜索请求

优点:

  1. 全键盘支持, 你可以不借助鼠标完成所有的筛选项并触发搜索

  2. 聚焦你所关注的筛选项, 多余的筛选项不再造成干扰

  3. 节省空间

number 类型

该类型处在开发状态下, 可以呈现出来给大家看下:

这里我使用的是鼠标进行操作, 键盘部分还没有开发完成. 由于优先级问题, 目前转而在开发 select 类型的筛选.

select 类型

这是一个常用的筛选项, 目前在负责的项目中大范围使用, 但是还没有一个好的办法来处理, 还处于构思中

其他类型

尚没有想法

结尾

这是一个我非常重视的一个组件, 这个组件的复杂度在开发的过程中也远超过了我的想象, 所以这将是一个长期的工作, 我需要更多的想法来充实大脑, 或许还能遇到大佬指点一番🤗.

组件的开发过程中, 我尽量采用了 TDD 的开发模式, 确实受益匪浅, 但也踩到了不少的坑, 不过还是收益更大., 所以后续的开发模式也尽量向 TDD 靠, 因为这不是一个需要快速迭代的项目, 而是注重稳定性.

代码目前没有开源, 如果有人感兴趣, 可以评论, 我会视情况是否将其开源🆙.

Thanks for your reading. 请 follow 我😎: github.com/Jiang-Xuan