Vaadin Grid用户列重排序功能实现及持久化方案咨询
Vaadin 7 实现优化
你当前的思路已经是Vaadin 7环境下最标准的原生实现方案,可在现有基础上做几个小优化降低出问题的概率:
- 触发列重排事件时增加用户操作判断:
addColumnReorderListener返回的事件对象内置isUserOriginated()方法,只有该方法返回true时才执行保存逻辑,过滤掉代码调用setColumnOrder触发的非用户操作,避免无效写库甚至循环触发的问题 - 存储内容轻量化:不需要序列化整个列对象,只需提取所有列的
propertyId,序列化为JSON字符串或者逗号分隔的字符串存入数据库即可,存储空间占用小,读取解析成本也更低 - 增加默认顺序兜底逻辑:如果查询不到对应用户的列顺序配置,直接 fallback 到系统默认列顺序,避免空指针或者列顺序异常
Vaadin 14+ 原生支持说明
Vaadin 14 对该功能的核心实现逻辑和Vaadin 7基本一致,只是API设计更简洁,适配场景更广:
- 列重排监听依然用
addColumnReorderListener方法,事件对象通过isFromClient()方法即可判断是否为用户主动触发的操作 - 列对象支持自定义唯一
key,存储时直接保存key的有序列表即可,相比propertyId适配动态列场景更灵活 - 恢复顺序时依然调用
setColumnOrder方法,传入你从数据库读取的顺序对应的列对象数组即可 - 额外支持列宽、列显隐状态的批量存取,如果你后续有相关需求可以直接扩展同一套存储逻辑
通用简化方案
目前Vaadin Directory确实没有专门封装该逻辑的轻量组件,建议你自行封装一个继承原生Grid的自定义组件,把监听重排事件、读取配置、写入配置的逻辑全部封装在组件内部,全局业务场景直接使用自定义Grid即可,不需要每个业务页面重复写相同逻辑,后续升级Vaadin 14时也只要修改自定义组件的适配逻辑,不用改动业务代码。
内容的提问来源于stack exchange,提问作者Tony B
相关产品推荐
相关产品推荐

