最近整理项目的时候,又想起之前做后台页面的一些事。列表、搜索、新增、编辑,这几块经常一起出现。同一个字段,有时候表格里要展示,搜索里要筛选,表单里还要填写。页面多了之后,类似的代码就会写很多遍。
为什么会想到用 Schema
比如商品管理里的「商品名称」,可能有这些需求:
- 表格里显示名称
- 搜索区可以按名称查询
- 新增、编辑表单里可以输入名称,而且必填
如果这几个地方分开写,后面改字段名或者标题时,就得分别找到对应位置。Schema 的思路就是先把字段信息放在配置里,表格、搜索和表单再根据各自需要读取。
下面是一个方便理解的简化例子,不是项目里的实际配置:
1 | const fields = { |
这样表格组件可以根据 table 决定显示哪些列,表单和搜索也各自读取对应的配置。公共页面不用每次都从零开始写,调整字段时也更容易找到配置在哪里。
不过上面例子里的 table、form、search 都是自己约定的配置项,不是 JSON Schema 标准字段。JSON Schema 本身主要用来描述和校验数据结构,页面怎么渲染还得看项目自己的实现。
什么都配进去也不一定好
刚开始做配置化时,很容易想把所有场景都塞进去。但实际业务总有一些特别的地方:字段之间要联动,某个按钮要打开复杂弹窗,或者表格里某一列要自己写展示方式。
这些逻辑如果全写进一个大配置对象,时间一长,读起来可能比普通组件还费劲。常见输入框、选择器、表格列和基础校验可以交给通用组件;业务特别复杂的部分,还是要留自定义组件或者其他扩展方式。
Elpis 里的 Schema 页面就有表格、搜索、表单和详情等配置;服务端的请求参数则使用 JSON Schema 和 Ajv 校验。两边虽然都叫 Schema,但不是说它们自动共用同一份配置,具体还要看项目怎么实现。
我现在的理解是,配置化比较适合结构相似的页面。如果一个页面本身就很特殊,直接写组件也没什么问题。先找到真正重复的部分,再慢慢抽出来,用起来会舒服一些。