应使用语义化表单结构:用包裹筛选区,分组并配说明,等控件设合法name属性;范围筛选统一用min_price/max_price,JS校验逻辑;内必须嵌套,配合FormData提取数据、form.reset()重置,并确保无障碍支持。

生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
为什么不用 div 堆筛选项
直接用一堆 <div> 包 <code><input> 或 <select></select>,后续 JS 拿值要写一堆 querySelector 魔术选择器,重置时还得手动清空每个字段。更麻烦的是,屏幕阅读器无法识别“这是价格筛选区”“这是分类多选区”,无障碍直接掉档。语义化不是为了好看,是让结构自带含义,方便提取、重置、读取。
推荐做法:
- 整个筛选区域包在
<form></form>里——这样form.reset()才能真正还原所有字段初始值 - 每个逻辑字段组(如“价格区间”“标签筛选”)用
<fieldset></fieldset>包裹,并配<legend></legend>说明用途 -
<fieldset name="price_range"></fieldset>这种写法虽不标准(name不是fieldset的合法属性),但可作为 JS 定位依据;真正起作用的是内部input的name - 多选标签用
<input type="checkbox" name="tag" value="react">,别用 class 模拟,否则 FormData 拿不到
怎么组织 price_range 这类范围型字段
范围筛选不是两个独立输入框,而是一个语义整体。用户改了“最低价”,系统不该立刻丢弃“最高价”的值,也不该让两个输入框各自提交为 min_price=100 和 max_price=500 却不校验逻辑(比如 min > max)。
实操建议:
- 把两个
input放进同一个<fieldset name="price_range"></fieldset>,并统一加data-field="range"标记便于 JS 统一处理 - 使用
name="min_price"和name="max_price"—— 后端接口通常也按这个 key 接收,避免 JS 再做映射 - 不要设
required在单个输入框上,而是由 JS 在提交前校验:若任一有值,则两个都应有效且min - 如果允许“只设上限”或“只设下限”,后端需支持
min_price=null或忽略该字段,前端别硬塞默认值(如min_price=0)干扰业务语义


















