vue 学习记录:model和v-model的区别

本文详细介绍了Vue中v-bind:model的用法,指出它是单向数据流的一种表现,用于传递数据到子组件。然而,v-model作为内置的双向绑定特性,允许子组件直接修改父组件的状态,但仅限于引用类型的值。理解这一区别对于掌握Vue的响应式系统至关重要。

:model是v-bind:model的缩写,是绑定自定义属性,它只是将父组件的数据传递给子组件,并没有实现父组件和子组件数据之间的双向绑定。(引用类型除外,若子组件改变引用类型的数据都话,父组件也会改变)

v-model是内置的数据双向绑定。

### Vue 中 `model` `v-model` 的区别Vue.js 中,`model` 是一种选项配置项,而 `v-model` 则是一个指令。它们的作用虽然都涉及数据的双向绑定,但在实际使用场景功能上有显著的不同。 #### 1. **`model` 配置** `model` 是 Vue 提供的一个组件选项,用于自定义子组件与父组件之间的同步方式。默认情况下,`v-model` 在子组件中会监听名为 `value` 的 prop 并触发 `input` 事件来更新父级的数据。然而,通过设置 `model` 选项,可以改变这种行为,指定不同的 prop 名称以及对应的事件名称[^1]。 例如,在 Vue 2Vue 3 中可以通过如下代码来自定义模型: ```javascript Vue.component('custom-input', { model: { prop: 'checked', event: 'change' }, props: ['checked'], template: ` <input type="checkbox" :checked="checked" @change="$emit('change', $event.target.checked)" > ` }); ``` 在这个例子中,`v-model` 将不再绑定到默认的 `value` 属性,而是绑定到了 `checked` 属性,并且触发的是 `change` 而不是 `input` 事件[^1]。 --- #### 2. **`v-model` 指令** `v-model` 是 Vue 提供的一种语法糖,简化了父子组件之间基于特定属性事件的双向通信过程。其实现原理本质上是结合了 `v-bind` `v-on` 来完成数据的单向流动事件响应机制[^3]。 对于普通的输入框来说,`v-model` 实际上相当于以下代码: ```html <input v-bind:value="msg" v-on:input="msg = $event.target.value" > ``` 因此,当我们在模板中写 `<input v-model="msg">` 时,实际上是在告诉 Vue 自动处理这个输入框的值绑定及其变更事件[^3]。 而在 Vue 3 中,`v-model` 变得更加灵活,支持多个命名的 `v-model` 绑定,这使得复杂表单的设计变得更加直观高效[^2]。比如下面的例子展示了如何在一个组件中同时管理多个状态: ```html <template> <child-component v-model:title="bookTitle" v-model:author="bookAuthor" ></child-component> </template> <script> export default { data() { return { bookTitle: '', bookAuthor: '' }; } }; </script> ``` 这里分别绑定了 `title` `author` 两个独立的状态给子组件,而不是像以前那样仅限于单一的 `value`。 --- #### 总结对比 | 特性 | `model` | `v-model` | |-----------------|----------------------------------|---------------------------------| | 类型 | 组件选项 | 模板指令 | | 主要用途 | 定义子组件接收 Prop 发出 Event 的规则 | 简化父组件与子组件间的数据交互 | | 默认行为 | 基于 `value` `input` | 动态绑定目标值并监听其变化 | | 是否可扩展 | 支持更改默认 Prop Event 名称 | Vue 3 中新增多字段支持 | --- ### 示例代码展示 以下是一段完整的示例,演示了如何利用 `model` 修改默认行为并与 `v-model` 结合使用的案例: ```html <div id="app"> <!-- 使用自定义的 checked --> <custom-checkbox v-model="isChecked"></custom-checkbox> <p>Checkbox is {{ isChecked ? 'checked' : 'unchecked' }}</p> </div> <script> Vue.component('custom-checkbox', { model: { prop: 'checked', event: 'change' }, props: ['checked'], template: ` <label><input type="checkbox" :checked="checked" @change="$emit('change', $event.target.checked)"> Custom Checkbox </label>` }); new Vue({ el: '#app', data: { isChecked: false } }); </script> ``` 此代码片段清楚地说明了 `model` 如何调整 `v-model` 的工作逻辑[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值