在自定义组件上使用时 v-model 和 .sync 有啥区别

Posted

技术标签:

【中文标题】在自定义组件上使用时 v-model 和 .sync 有啥区别【英文标题】:What is the difference between v-model and .sync when used on a custom component在自定义组件上使用时 v-model 和 .sync 有什么区别 【发布时间】:2020-01-16 18:06:09 【问题描述】:

我不明白组件上使用的 v-model 和 .sync 之间的区别。

<my-component v-model="myVar">

V-model 是将变量 (myVar) 绑定到组件属性 'value' 并监听组件发出的 'input' 事件以更新变量 'myVar' 的简写。

<my-component v-bind:prop1.sync="myVar">

.sync 是将变量 (myVar) 绑定到组件属性(在本例中为“prop1”)并监听组件发出的“update:prop1”事件以更新变量“myVar”的简写。

我知道默认情况下 v-model 仅适用于 'value' 属性和 'input' 事件,但即便如此也可以使用组件中的 'model' 选项进行自定义。

如果有人可以向我解释区别或何时使用什么,那就太好了。

这是一个example,我在其中以三种不同的方式使用了相同的组件: 1)手动绑定+事件监听 2) .sync 3) v-model

【问题讨论】:

【参考方案1】:

对于 Vue.js 2,两者几乎都做同样的事情 - 启用双向绑定,尽管 .sync 更通用。它是在为组件添加 v-model 之后添加的。 .sync 允许对多个道具使用 v-model 逻辑。对比一下:

.sync
<comp :value.sync="username" :age.sync="userAge" />

扩展到:

<comp :value="username" :age="userAge" @update:name="val => userName = val" @update:age="val => userAge = val" />
v-model
<comp v-model="userName" />

扩展到:

<comp :value="username" @input="val => username = val" />

我们可以看到的区别是:

默认的属性名称 v-model 始终绑定到名为 value 的属性

.sync 允许你使用多个道具

组件发出的事件名称(.sync@updatev-model@input

.sync 的一个非常有趣的特性是它对对象的特殊处理。 .sync 修饰符在对象上使用时会同时设置多个道具(更多 here)

使用哪一个?使用属性value 作为组件的键值载体是一种标准模式。在这种情况下,如果您有 value 属性并希望为其启用 2 路绑定,请使用 v-model。在所有其他情况下使用.sync

【讨论】:

想补充一个你错过的点。我们不一定需要使用 'value' 道具和 'input' 事件。我们可以修改它-digitalocean.com/community/tutorials/… 您认为有人为其他开发人员开发组件以支持 v-model.sync api 用于他们的“单一可编辑道具”组件是否有意义?即同时发出inputupdate:value?我担心发出太多事件,但也认为这不会成为问题 它说我不推荐使用,另请参阅:eslint.vuejs.org/rules/no-deprecated-v-bind-sync.html【参考方案2】:

没有太大区别,以至于有计划将它们合并到 Vue 3 中:

https://github.com/vuejs/rfcs/pull/8

如果组件具有双向绑定的自然候选者,您将使用v-model。所以文本输入、复选框等都将使用v-model。同样,它在具有选择概念的组件的上下文中可能是有意义的。您可以改用 sync,但这通常不是其他开发人员所期望的。

在 Vue 2 中,您只能将单个道具/事件连接到 v-model。如果你想对多个道具/事件进行双向绑定,那么你必须使用sync

Vuetify 包含几个同时使用v-modelsync 的组件示例。例如v-autocomplete:

https://vuetifyjs.com/en/components/autocompletes

这将v-model 用于选定的值,但它也将sync 用于errorsearch-input

【讨论】:

以上是关于在自定义组件上使用时 v-model 和 .sync 有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

vue v-model 在自定义组件上的使用教程

如何在自定义组件上启用 v-model?

组件使用v-model$listeners.sync(区别于v-model的双向数据绑定)

Vue 中 v-model 在自定义组件中的使用

vue框架之自定义组件中使用v-model

Vue学习Vue高级特性