vue 3条件组合筛选器采用配置驱动设计,通过json配置动态渲染控件,实现状态隔离与类型识别;支持插槽、事件透传、属性继承及折叠展开等扩展能力。

在 Vue 3 中封装条件组合筛选器,核心是「配置驱动 + 类型识别 + 状态隔离」。不写死表单项,而是通过一个结构清晰的 JSON 配置数组,让组件自动渲染 input、select、date-picker、daterange 等不同控件,并统一处理查询、重置、布局、占位与事件回传。
一、定义标准配置结构
每个筛选项用一个对象描述,关键字段必须明确:
- label:显示标签文字(如“用户名”)
- prop 或 key:字段唯一标识(用于绑定 v-model 和提交参数)
- type:控件类型(input / select / date / daterange / cascader 等)
- value:初始值(支持 undefined 或 null,组件内自动初始化为空字符串/数组/null)
-
options(select/cascader 专用):下拉选项数组,格式为
[{ label: '启用', value: 1 }] - span(可选):跨列数(如日期范围常设为 2,避免挤压)
- placeholder(可选):自定义占位符,未设置时默认用 label
二、组件内部状态与响应逻辑
使用 reactive 创建独立表单数据对象,**不直接绑定父组件传入的原始配置值**,避免污染外部状态:
- 遍历配置项,为每个
item.prop初始化formData[item.prop] = item.value ?? '' - 所有输入均绑定到该内部
formData,保证重置时能一键清空 - 点击「查询」时,只 emit 当前
formData对象(已过滤掉空值或 undefined 的字段) - 点击「重置」时,重置
formData到初始快照,不调用父组件的 resetFields
三、动态渲染与布局控制
用 v-for + v-if 匹配 type 渲染对应控件,配合 Flex 布局实现自动换行和右侧按钮对齐:
- 外层
<el-form inline></el-form>设display: flex; flex-wrap: wrap - 每个
<el-form-item></el-form-item>设置flex: 0 0 calc(25% - 8px)(默认每行 4 项),支持传入colCountprop 动态调整 - 「查询」「重置」按钮放在单独的
<el-form-item></el-form-item>,加margin-left: auto推至最右 - 对
daterange类型,额外加 class 控制宽度为 100%,避免被等分挤压
四、扩展性设计要点
真正复用性强的筛选器,要预留向上穿透能力:
-
插槽支持:为特定字段提供
#field-{prop}插槽,可完全自定义 UI(如带搜索的远程 select) -
事件透传:通过
eventHandle对象接收父组件传入的事件处理器(如change,visible-change) -
属性继承:用
v-bind="item.bind || {}"向子控件透传任意原生属性(如clearable,disabled,filterable) - 更多条件折叠:超出指定行数(如 2 行)时收起,点击「展开更多」下拉展示剩余项(非弹窗,保持表单连续性)
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










