v-model在Vue.js中的非表单应用场景是什么?

v-model除了用在表单上还有哪些应用场景?

在el-drawer组件上使用了v-model,为什么这个组件需要v-model呢?它也不涉及表单,直接传一个ref不可以吗?

阅读 1.5k
avatarAI BotBETA

v-model在Vue.js中的非表单应用场景

v-model 在 Vue.js 中主要用于创建双向数据绑定,通常与表单元素(如 <input>, <textarea>, <select> 等)一起使用。然而,它的工作原理并不局限于表单元素。v-model 实际上是一个语法糖,它利用了 Vue 的实例属性和事件监听器(value 属性和 input 事件)来创建双向绑定。

在非表单应用场景中,v-model 可以与任何可以接收 value prop 并触发 input 事件的组件一起使用。这种设计使得 v-model 变得非常灵活,可以用于自定义组件的双向数据绑定。

除了用在表单上,v-model还有哪些应用场景?

除了表单元素外,v-model 可以与以下类型的组件一起使用:

  1. 自定义组件:当你需要为自定义组件创建双向数据绑定时,可以在组件内部使用 props 来接收 value,并使用 $emit 来触发 input 事件。这样,你就可以在自定义组件上使用 v-model 了。
  2. 非表单 UI 组件:有些 UI 组件,如滑块(slider)、开关(switch)或颜色选择器(color picker),虽然不是传统的表单元素,但它们仍然需要双向数据绑定。在这些情况下,你可以使用 v-model 来简化代码。
  3. 复杂表单元素:对于复杂的表单元素(如日期选择器、时间选择器、范围选择器等),v-model 可以帮助你将组件的内部状态与父组件的数据进行同步。

在el-drawer组件上使用了v-model,为什么这个组件需要v-model呢?它也不涉及表单,直接传一个ref不可以吗?

el-drawer 组件(假设这是 Element UI 或类似 UI 库中的一个组件)可能使用 v-model 来控制其打开和关闭状态。虽然 el-drawer 本身不是一个表单元素,但它有一个可以切换的“状态”(即打开或关闭)。

使用 v-model 可以方便地绑定一个布尔值到 el-drawer 的打开/关闭状态,而不需要显式地监听事件或设置属性。此外,v-model 提供了更直观的语法,使得代码更易于阅读和维护。

虽然你可以使用 ref 来引用 el-drawer 实例并直接调用其方法来控制状态,但这通常不是最佳实践。使用 v-model 可以保持数据与视图之间的清晰分离,并允许你更容易地在多个组件之间共享和同步状态。

2 个回答

因为 ele-plus 是UI组件库啊,总不能不提供对应的API,让用户自己去操作 refs 吧,或者和 ele-ui 2x 时期一样,通过 props 传入 visible,然后再手动监听 update:prop 的方式去手动改变 visible 属性。那也太容易让人诟病了。
所以如果都已经提供了 visibleupdate:prop 或者类 open/close 的方法,那不就是提供了和 v-model 的功能类似了,所以直接使用 v-model 这样的语法糖不是很简便吗(当然你也可以不用 v-model 手动去控制组件的显隐)。


ele-ui 2x 时期的 el-drawerel-dialog 都是通过 props.sync 的方式来实现的。但这其实是因为 Vue 2x 不支持绑定多个 v-modelVue 3x 已经支持了多个 v-model 的绑定,而且移除了 sync 修饰符,所以 ele-plus 就是现在的状态了了。


其实在你 上一个问题 中我就已经简单描述过两种不同的设计路径了,对于UI库来说是不知道用户是否会在 on-open/on-close 时期做一些额外的处理。所以会通过抛出多个事件的方式来用户在组件外部自行处理。

而我们自己封装的业务组件,很多时候是会做一些通用的初始化,并且很明确我们是知道是有哪些方法可以被调用的。所以把这些打开/关闭功能放到“抽屉”组件内部就可以简写很多重复业务代码。如果通过 watch:props 的方式去初始化,有需要判断很多复杂场景(新增打开、编辑打开、查看详情等等)。所以才会推荐使用 refs 去调用内部方法的形式。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题