返回

揭秘Vue3 v-model中的鲜为人知的神奇用法

前端

Vue3 v-model的常规用法

在Vue3中,v-model指令主要用于实现表单元素的双向绑定。通过v-model指令,你可以将表单元素的值绑定到Vue实例的数据上,当表单元素的值发生变化时,Vue实例的数据也会随之更新。反之,当Vue实例的数据发生变化时,表单元素的值也会随之更新。

<input v-model="name">

上面的代码将表单元素<input>的值绑定到Vue实例的name数据上。当用户在<input>元素中输入值时,name数据的值也会随之更新。反之,当name数据的值发生变化时,<input>元素中的值也会随之更新。

鲜为人知的神奇用法

除了常规用法之外,v-model指令还有一些鲜为人知但非常实用的语法。这些语法可以帮助你更轻松地实现各种表单操作和数据绑定。

1. 在子组件中使用v-model

在Vue2中,将方法绑定在一级子组件上后,一级子组件引入二级子组件,在子组件上通过v-on绑定$listeners,这样二级子组件就可以直接调用父组件的方法。注意注意!!在Vue3中移出了$listeners,但是并不代表调用方法消失了,在官方文档中,调用绑定方法被合并到了$attrs$emit中。

<!-- 父组件 -->
<template>
  <ChildComponent v-bind="$attrs" @update-name="updateName" />
</template>

<script>
export default {
  methods: {
    updateName(name) {
      this.name = name;
    }
  }
};
</script>

<!-- 子组件 -->
<template>
  <input v-model="name" @input="$emit('update-name', $event.target.value)">
</template>

<script>
export default {
  props: ['name'],
  emits: ['update-name']
};
</script>

在上面的代码中,ChildComponent组件通过v-bind="$attrs"将父组件传递过来的属性绑定到自身。当ChildComponent组件中的<input>元素的值发生变化时,会触发input事件,然后通过$emit('update-name', $event.target.value)将新值发射给父组件。父组件收到新值后,会调用updateName方法更新自己的name数据。

2. 在v-model中使用修饰符

Vue3中的v-model指令支持多种修饰符,这些修饰符可以让你对v-model指令的行为进行更多的控制。

  • .lazy:延迟更新数据,直到失去焦点
  • .number:将输入的值解析为数字
  • .trim:在更新数据之前,修剪输入值中的空格
  • .debounce:在更新数据之前,等待一定时间
  • .throttle:在一定时间内,只更新数据一次
<input v-model.lazy="name">

上面的代码使用.lazy修饰符,延迟更新数据,直到失去焦点。这意味着,当用户在<input>元素中输入值时,name数据的值不会立即更新。只有当用户失去焦点时,name数据的值才会更新。

3. 在v-model中使用动态参数

v-model指令还支持动态参数,你可以使用动态参数来动态地改变v-model指令的行为。

<input v-model="model[dynamicKey]">

上面的代码使用动态参数dynamicKey,动态地改变v-model指令绑定的数据。当dynamicKey的值发生变化时,v-model指令绑定的数据也会随之变化。

结语

本文介绍了Vue3 v-model指令的一些鲜为人知的神奇用法。这些用法可以帮助你更轻松地实现各种表单操作和数据绑定。希望你能够熟练掌握这些用法,并将其应用到你的项目中。