Vue父子组件间双向数据绑定:v-model与dineModel详解
本文最后更新于 2024年10月26日 凌晨
在Vue开发中,父子组件之间经常需要进行数据传递和交互。使用v-model指令可以很容易地在父子组件之间实现数据的双向绑定。本文将详细介绍Vue父子组件使用v-model的方法和注意事项。
最近有一个小发现,Vue3.3版本开始,v-model
这个语法糖有了些许调整;这里就来说一下。
v-model
要解释什么是v-model
,可能要先解释一下Vue中的子父组件传值:
props
: 子组件用来接收从父组件传递的数据;在Vue中,父组件到子组件的数据传递可以通过props
实现的。父组件可以通过props
向下传递数据给子组件,子组件通过定义props
选项来接收来自父组件的数据。这种数据流是单向的,意味着子组件不能直接修改props
中的数据,因为这将导致父子组件间的数据状态不一致性,Vue中会发出警告。emit
: 子组件用来向父组件发送消息;当子组件需要将数据变化通知父组件时,它可以使用$emit
来触发一个事件,并将数据作为事件的参数传递给父组件。父组件监听这个事件,并在回调函数中处理接收到的数据。通常用于子组件向父组件发送信号告知某些动作已经发生,或者数据需要更新。
在这样的机制下,Vue提供了v-model
语法糖指令来简化双向数据绑定,也就是在子组件内,使用特定的props
属性和emit
事件,就可以使用v-model
简化父组件内的传值流程,进而实现数据双向绑定。
只是在Vue2、Vue3.0~Vue3.3和Vue3.3+内有所不同。
Vue2
在Vue2中,使用v-model
,会自动使用名称为value
的props属性,和使用名称为input
的监听事件。进而使用这个特性,封装自己的组件:
1 |
|
这样父组件内部,可以有原本<child :value="username" @input="username=$event" />
,简化为<child v-model="username" />
当然,有些人可能会使用$refs
,通过父组件调用子组件内部公开的方法来完成数据的同步,比如:
1 |
|
但是我认为,$ref
作为获取子组件DOM元素、访问子组件实例的工具钩子;如果是封装组件,特别是表单类别、渲染模块,那么使用v-model
更优雅,不用考虑还需要$refs
二次调用的情况。
Vue3.0~Vue3.3
但是,Vue3版本开始有所不同。在[Vue3.0, Vue3.3)
版本之间,为了更好地支持组合式 API 和一致性,Vue 3引入了modelValue
和@update
的语法糖,以取代先前的value
和@input
:
1 |
|
在[Vue3.0, Vue3.3)
之间,等于:
1 |
|
具体的使用样例:
1 |
|
子组件实现:
1 |
|
但是,在Vue3.3版本开始(稳定版本应该是Vue3.4)。有有所不同。
Vue3.4
在Vue版本<3.3
的情况下,就如上文一样,v-model
是modelValue
和@update
的语法糖;甚至在Vue2.x时代,是value
和@input
的语法糖。
你当然可以在Vue3.4时候,继续使用modelValue
和@update
的语法糖,但是Vue3.4开始,引入一种更优雅的方式:defineModel
,参考自: https://blog.vuejs.org/posts/vue-3-4:
1 |
|
具体在setup()内使用,非常简单:
1 |
|
也就是,使用defineModel
,你就不需要强制在子组件内定义modelValue
和@update
了。这个新的语法糖,进一步简化了代码。
如果你想获取v-model
的描述,比如定义首字母大写:
1 |
|
那么用defineModel
的形式,可以这样:
1 |
|
可以看到,Vue3.4的新特性,还是非常好用的。
支持创作
制作教程不易,如果热心的小伙伴,想支持创作,可以加入我们的电圈(还可以解锁远程协助、好友位😃):
- Mintimate的电圈: https://afdian.com/a/mintimate
- Mintimate的微信赞赏码 👉 如果认为本教程对你很有帮助,可以请我喝咖啡 ☕
志同道合的小伙伴也是知音难觅。
- 开发者爱好群: 👉 如果你对云服务器、CDN、云数据库和Linux等云计算感兴趣,亦或者喜欢编程、设计、产品、运营等领域,欢迎加入我们的开发者爱好群,一起交流学习(目前可能就我一个人?🤔,毕竟才刚刚创建~)。
当然,也欢迎在B站或YouTube上关注我们:
- Bilibili: https://space.bilibili.com/355567627
- YouTube: https://www.youtube.com/@mintimate/featured
更多:
END
在本文中,我们深入探讨了在Vue框架中,父子组件之间数据通信的核心机制,并特别关注了v-model
指令的功能与在Vue版本迭代中的变化。通过对props
和emit
机制的解析,我们了解了如何在组件间单向传递数据以及如何通知父组件子组件的数据变化。
随着Vue3起的变更,v-model
的包装参数的名称更加合理,特别是在Vue3.4及以后的版本中引入的defineModel
配置方式更加简洁和优雅。
希望文章对你有用嗷。