Vue计算属性实现搜索过滤的关键是将输入值设为响应式依赖,通过v-model.trim绑定searchKeyword,computed中用filter()多字段匹配并忽略大小写,模板遍历filteredItems,支持防抖、高亮和组合筛选。

用 Vue 计算属性实现搜索列表实时过滤,关键在于把输入值变成响应式依赖,让过滤逻辑自动触发、自动缓存。不用手动监听、不用反复调用方法,写起来干净,运行时也高效。
绑定搜索关键词:用 v-model 实时同步输入
在 data 或 setup 中定义一个字符串变量,比如 searchKeyword,初始值设为空字符串 "",避免 undefined 导致 includes 报错。
模板中用 v-model.trim="searchKeyword" 绑定输入框。trim 会自动去掉首尾空格,减少无效匹配。
- 不建议用 @input + this.searchKeyword = $event.target.value,v-model 更简洁且语义明确
- 如果需要回车触发、或兼容旧版浏览器,再考虑加 @keyup.enter 事件
写计算属性:用 filter() 做匹配,支持多字段和大小写忽略
在 computed 中定义一个新属性,例如 filteredItems。它内部调用原始列表的 filter 方法,对每项指定字段做判断。
立即学习“前端免费学习笔记(深入)”;
推荐统一转小写比对,提升容错性;搜索词为空时直接返回原数组,避免渲染空列表。
从零开始编排 SpringBoot+Vue 全栈项目工作流,适用于新建全栈项目或完整脚手架请求,触发后依次调用 product‑spec‑builder(需求调研)等模块。
- 基础写法:item.name.toLowerCase().includes(searchKeyword.toLowerCase())
- 多字段搜索:item.title.includes(kw) || item.desc.includes(kw) || item.tags?.includes(kw)
- 防空处理:if (!searchKeyword.trim()) return originalList
模板中直接遍历计算属性:不操作原始数据
在 v-for 中不再写 v-for="item in items",而是改成 v-for="item in filteredItems"。这样 DOM 只响应最终结果,结构清晰、性能可控。
可以配合条件渲染显示提示信息:
- v-if="filteredItems.length === 0 && searchKeyword">没找到匹配项
- v-else 渲染正常列表
进阶可选:防抖、高亮、组合筛选
基础过滤已足够大多数场景。若列表量大或用户输入频繁,可加防抖——不是改 computed,而是在 v-model 更新前节流,比如用 setTimeout 或封装 debounce 函数。
想高亮搜索词?先靠 computed 过滤,再在模板中用 v-html 配合正则替换(注意转义 HTML 字符防 XSS)。
如果有分类下拉、状态开关等其他筛选条件,把它们一并纳入同一个 computed,用逻辑与(&&)或逻辑或(||)组合判断,保持响应式联动。

















