vue2 中
我们知道在 vue2 中有 3 个硬编码的修饰符:lazy
、number
和trim
,他们的作用分别如下:
- lazy:将触发
input
事件转为触发change
事件,在某些场景下来降低数据同步频率提升性能。
1 | <!-- 在“change”时而非“input”时更新 --> |
- number:自动将用户的输入值转为数值类型。
1 | <input v-model.number="age" type="number" /> |
- trim:自动过滤用户输入的首尾空白字符
1 | <input v-model.trim="msg" /> |
vue3 中
不同于 vue2 的硬编码,在 vue3 中支持自定义修饰符:
1 | <my-component v-model.capitalize="bar"></my-component> |
组件接收自定义修饰符:
1 | app.component('my-component', { |
我们看到组件会接收一个属性为modelModifiers
的对象,上面示例给出了默认值{}
,然后在生命周期函数created
中拿到了修饰符capitalize的值为true
(因为在上面组件使用时绑定了v-model.capitalize="bar"
)。
接下来,我们实现修饰符capitalize
,即将 v-model 绑定的值首字母大写:
1 | app.component('my-component', { |
我们来看看效果:
由于 vue3 支持组件同时绑定多个带参数的 v-model(不带参数的话只有第一个 v-model 是有效的),所以在带参数的情况下,修饰符属性命名就变成了参数名 + "Modifiers"
,我们看下面代码:
1 | <my-component |
组件实现:
1 | app.component('my-component', { |
上面代码中,我们的参数名是firstName
和lastName
,所以自定义组件接收到的修饰符属性由原来的modelModifiers
修改为firstNameModifiers
和lastNameModifiers
。
下面我们来看完整的实现:
1 | // 创建APP |
至此,v-model 在 vue2 和 vue3 中的应用就基本讲完了,欢迎大家留言或加微信(cleam_lee)讨论!
汇总: