一份字段配置,七个智能筛选组件。componentType 是一等公民,FilterField 自动分发渲染; 所有组件输出统一的 Criteria 语义节点;数据库联想与 AI 解析通过 api 适配器注入,全部可选、优雅降级。
精确筛选的交互细节已经做好,你只管声明字段
FilterField 按 field.componentType 自动渲染 7 种组件,统一透传 props、统一转发事件,告别成片的 v-if / v-else-if。
每个组件通过 criteria-change 输出标准 Criteria 节点(field / componentType / operator / value),空值输出 null,直接序列化提交任意后端。
自然语言时间/数值解析、语义正反向词扩充,由你注入的 api 适配器完成;未配置时规则、直接等本地模式照常可用。
库本身不发起任何 HTTP 请求。6 个适配器函数覆盖全部外部能力,可对接任意 REST 后端与任意 AI 服务。
选项内值精确匹配(eq / in),自定义输入模糊匹配(like),混选输出 mixed 节点;蓝橙标签让匹配方式一目了然。
AI 对话 / 规则 / 直接三种输入模式自由切换,虚拟标签(年龄)与真实字段标签(出生日期)双标签联动。
纯 HTML/CSS 绘制的示意界面 · 交互细节见 组件详情 与 Playground
选项选择(单选/多选),本地选项过滤不查库,自动区分精确 / 模糊
文本 LIKE 模糊搜索,数据库 LIKE 实时搜索参考片段,点击上屏
关键词经 AI 扩充为正 / 反向词集合,标签化编辑
AI 对话 / 规则 / 直接三模式,虚拟字段(年龄)⇄ 真实日期列换算
数值比较:规则模式(算符 + 数值)/ AI 对话模式两选一
三态开关:开 / 关 / 未设置,标签可自定义
单个标识码精确查询,eq 匹配,极简交互
读取字段配置的 componentType,自动渲染上述组件并统一转发事件——筛选栏里每一行都是它
<FilterField v-model="values[f.field]" :field="f" @criteria-change="onCriteriaChange(f.field, $event)" />
三分钟跑通:安装 → 注入 api → FilterField 渲染 → 收集 Criteria
npm i smart-filter-vue
# peer 依赖(如尚未安装)
npm i vue@^3 element-plus@^2 @element-plus/icons-vue@^2
import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import SmartFilter from 'smart-filter-vue'
import 'smart-filter-vue/style.css'
import App from './App.vue'
// mock api:所有函数可选,缺失时组件优雅降级
const mockApi = {
suggestFieldValues: async (field, keyword, { limit }) => {
const db = { name: ['张伟', '张媛', '李娜'] }
const list = (db[field] || []).filter(v => v.includes(keyword))
return { suggestions: list.slice(0, limit) }
},
}
createApp(App)
.use(ElementPlus)
.use(SmartFilter, { api: mockApi })
.mount('#app')
<script setup>
import { reactive, computed } from 'vue'
import { FilterField } from 'smart-filter-vue'
const fields = [
{ field: 'department', label: '部门',
componentType: 'smart_option', operator: 'in',
options: ['研发部', '市场部', '人事部'],
optionSource: { type: 'static' },
componentProps: { multiple: true } },
{ field: 'name', label: '姓名',
componentType: 'text_input', operator: 'like' },
]
const values = reactive({})
const nodes = reactive({})
const criteria = computed(() =>
Object.values(nodes).filter(Boolean))
</script>
<template>
<el-form-item v-for="f in fields" :key="f.field"
:label="f.label">
<FilterField v-model="values[f.field]" :field="f"
@criteria-change="nodes[f.field] = $event" />
</el-form-item>
<pre>{{ criteria }}</pre>
</template>
[
{ "field": "department", "componentType": "smart_option",
"operator": "in", "value": ["研发部", "市场部"] },
{ "field": "name", "componentType": "text_input",
"operator": "like", "value": "张" }
]
使用说明书(仓库 docs/ 目录)
安装、注入 api 适配器、渲染第一个字段、收集整表 Criteria
阅读 →field / componentType / optionSource / componentProps / 双标签 / summaryTemplate
阅读 →节点逐字段说明、每种组件的节点实例、兼容矩阵与树结构
阅读 →6 个适配器函数的入参 / 返回 / 降级行为,REST 与 mock 完整示例
阅读 →每个组件的 props、事件、模式说明与配置示例
阅读 →纯静态交互演示:本地过滤、联想、三态开关、时间换算
体验 →