当前位置:首页 > VUE

vue中vmodel实现原理

2026-01-23 10:17:50VUE

Vue 中 v-model 的实现原理

v-model 是 Vue 提供的一个语法糖,用于在表单元素或自定义组件上实现双向数据绑定。其本质是结合了 :value 绑定和 @input 事件监听。

表单元素上的实现

对于原生表单元素(如 input、textarea、select),v-model 会根据元素类型自动生成对应的属性和事件:

<input v-model="message">

等价于:

<input 
  :value="message"
  @input="message = $event.target.value"
>

不同表单元素的实现细节略有差异:

  • text 和 textarea:使用 value 属性和 input 事件。
  • checkbox 和 radio:使用 checked 属性和 change 事件。
  • select:使用 value 属性和 change 事件。

自定义组件上的实现

在自定义组件中使用 v-model 时,默认会利用 value prop 和 input 事件:

<custom-component v-model="message"></custom-component>

等价于:

<custom-component 
  :value="message"
  @input="message = $event"
></custom-component>

从 Vue 2.2.0 开始,可以通过 model 选项修改默认的 prop 和事件名称:

export default {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: ['checked'],
  methods: {
    handleChange() {
      this.$emit('change', newValue)
    }
  }
}

Vue 3 中的变化

Vue 3 对 v-model 进行了改进:

  • 默认使用 modelValue prop 和 update:modelValue 事件。
  • 支持多个 v-model 绑定,如 v-model:title="title"
  • 移除 .sync 修饰符,其功能由多个 v-model 替代。

底层实现机制

Vue 的编译器会将 v-model 编译为对应的属性和事件绑定。例如:

<input v-model="message">

编译后的渲染函数类似:

h('input', {
  domProps: {
    value: message
  },
  on: {
    input: function($event) {
      message = $event.target.value
    }
  }
})

对于自定义组件,编译结果会使用组件定义的 prop 和事件。

vue中vmodel实现原理

标签: 原理vue
分享给朋友:

相关文章

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const Bas…

vue tag实现

vue tag实现

Vue 标签实现方法 在 Vue 中实现标签功能可以通过多种方式完成,常见场景包括动态标签生成、标签输入框、标签管理等。以下是几种典型实现方案: 动态标签列表渲染 使用 v-for 指令渲染标签数组…

vue实现图库

vue实现图库

Vue 实现图库的基本方法 使用 Vue 实现图库功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用 Vue 和第三方库(如 Vue Gallery) 安装 vue-gallery 或…

vue实现route

vue实现route

Vue 路由实现方法 Vue 中实现路由通常使用 vue-router 库,这是 Vue 官方推荐的路由管理器。以下是具体实现步骤: 安装 vue-router 通过 npm 或 yarn 安装…

vue实现翻译

vue实现翻译

Vue 实现翻译功能的方法 使用 i18n 插件实现多语言切换 安装 vue-i18n 插件: npm install vue-i18n 创建语言资源文件(如 en.json 和 zh.json)…

vue diff实现

vue diff实现

Vue Diff 算法实现原理 Vue 的虚拟 DOM Diff 算法(即 patch 过程)是其高效渲染的核心,主要通过对比新旧虚拟节点的差异,最小化 DOM 操作。以下是关键实现要点: 同层级…