v-model 本身不支持过滤,需通过 input 事件拦截赋值、计算属性 set/get 封装或内置修饰符实现过滤。常用方式为 @input 中校验后手动赋值,或用 computed 模拟带过滤的 v-model,辅以 trim/number 等修饰符及防抖优化。

v-model 本身不直接支持过滤逻辑,但它可以和响应式数据、事件监听或计算属性配合,实现输入内容的实时过滤效果。关键不是“给 v-model 加过滤器”,而是控制它绑定的数据值——在用户输入时,主动干预赋值过程。
用 input 事件 + 手动赋值拦截非法内容
这是最常用、最可控的方式。v-model 提供双向绑定便利,但你可以在 @input 中对原始输入做校验或格式化,再决定是否更新绑定的数据。
- 监听 input 事件,获取原始输入值(
$event.target.value) - 用正则或逻辑判断该值是否合法(比如只允许数字、不能含空格、长度限制等)
- 只在合法时才赋值给响应式变量;非法则保持原值或清空
示例:只允许输入正整数
<input :value="count"> { const val = e.target.value; if (/^\d*$/.test(val)) count = val; }"
/>
注意这里没用 v-model,而是用 :value + @input 手动控制,避免 v-model 自动覆盖你刚做的校验。
用计算属性的 set/get 模拟带过滤的 v-model
适用于需要复用、封装成组件的场景。把过滤逻辑收进 computed 的 setter 里,对外仍保持 v-model 的使用习惯。
- 定义一个普通 ref 存原始值(如
rawValue) - 用 computed 包一层,getter 返回处理后的值,setter 对输入做清洗后再存入 rawValue
- 模板中对这个 computed 属性使用 v-model
例如:输入自动转小写并去首尾空格
递归分析 Vue 项目组件依赖,从入口文件生成组件层级图,支持 Vue 2/3,输出组件名、文件路径和属性。适用于分析组件结构、排查依赖或了解项目架构。
const rawValue = ref('')<br>const filteredValue = computed({<br> get() { return rawValue.value.trim().toLowerCase() },<br> set(val) { rawValue.value = val }<br>})
模板:<input v-model="filteredValue">
结合 v-model.trim 和 v-model.number 等内置修饰符
Vue 3 内置了几个轻量过滤修饰符,适合常见简单场景:
-
v-model.trim:自动去除首尾空格,等价于手动调用.trim() -
v-model.number:尝试将输入转为数字,非数字时返回NaN或空字符串(取决于上下文) -
v-model.lazy:把触发时机从input改为change(失焦时),适合减少频繁更新
这些不能替代自定义过滤,但能减少基础处理代码。
防抖过滤(适合搜索框等异步场景)
如果过滤目的是触发远程搜索或复杂计算,不建议“每输一个字都执行”,而应加防抖。
- 不用 v-model 直接驱动搜索,而是用 ref 存 keyword,监听 input 事件启动防抖函数
- 防抖函数内部调用搜索 API 或更新计算结果
- 这样既保持输入流畅,又避免请求泛滥
本质是把“过滤”理解为“控制何时响应输入”,而不是“修改输入值本身”。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!









