当前位置:首页 > VUE

vue v model的实现

2026-02-24 00:34:27VUE

Vue v-model 的实现原理

Vue 的 v-model 是一个语法糖,用于在表单元素或组件上实现双向数据绑定。其核心是通过 value 属性和 input 事件的组合实现数据同步。

基本实现(以 input 元素为例)

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

等价于:

<input v-model="message">

在自定义组件中的实现

自定义组件中,v-model 默认利用 value 属性和 input 事件实现双向绑定。以下是自定义组件的实现方式:

vue v model的实现

<template>
  <input 
    :value="value" 
    @input="$emit('input', $event.target.value)"
  >
</template>

<script>
export default {
  props: ['value']
}
</script>

使用 model 选项自定义

Vue 2.2.0+ 支持通过 model 选项修改默认的 v-model 绑定属性和事件:

export default {
  model: {
    prop: 'checked',  // 修改默认的 value 属性
    event: 'change'   // 修改默认的 input 事件
  },
  props: ['checked']
}

Vue 3 中的变化

Vue 3 中 v-model 的默认行为有所调整:

  • 默认使用 modelValue 作为 prop 名
  • 默认使用 update:modelValue 作为事件名

自定义组件示例(Vue 3)

vue v model的实现

<template>
  <input
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
  >
</template>

<script>
export default {
  props: ['modelValue'],
  emits: ['update:modelValue']
}
</script>

多个 v-model 绑定

Vue 3 支持在单个组件上绑定多个 v-model

<CustomComponent 
  v-model:first="firstValue"
  v-model:second="secondValue"
/>

组件内部实现:

export default {
  props: {
    first: String,
    second: String
  },
  emits: ['update:first', 'update:second']
}

修饰符处理

v-model 支持修饰符(如 .lazy, .number),组件可以通过 modelModifiers prop 访问这些修饰符:

export default {
  props: {
    modelValue: String,
    modelModifiers: {
      default: () => ({})
    }
  },
  created() {
    console.log(this.modelModifiers) // 例如 { capitalize: true }
  }
}

底层原理总结

  1. 编译阶段将 v-model 转换为 value prop 和 input 事件监听(Vue 2)或 modelValue prop 和 update:modelValue 事件(Vue 3)
  2. 表单元素输入时触发事件,更新父组件数据
  3. 父组件数据变化时,通过 prop 向下传递新值
  4. 自定义组件通过 $emit 触发事件通知父组件更新

标签: vuemodel
分享给朋友:

相关文章

vue实现点击旋转轮盘

vue实现点击旋转轮盘

实现点击旋转轮盘效果 在Vue中实现点击旋转轮盘效果,可以通过CSS动画和Vue的数据绑定结合完成。以下是一个完整的实现方案: 准备工作 需要安装Vue.js环境,可以通过CDN引入或使用Vue C…

vue实现用户信息删除

vue实现用户信息删除

Vue 实现用户信息删除功能 在 Vue 中实现用户信息删除功能通常涉及前端界面交互和后端 API 调用。以下是实现步骤: 前端界面设计 创建删除按钮或操作项,通常使用 @click 事件触发删除…

vue优秀实现

vue优秀实现

Vue.js 优秀实现方法 响应式数据管理 使用 Vue 的 ref 和 reactive 处理基础类型和对象类型数据,结合 computed 计算属性优化渲染性能。对于复杂状态,推荐 Pinia 替…

vue实现分类

vue实现分类

Vue实现分类功能的方法 使用v-for和计算属性 通过计算属性对数据进行分类处理,结合v-for渲染分类后的列表。示例代码: <template> <div>…

vue实现遮罩

vue实现遮罩

Vue 实现遮罩层的方法 在 Vue 中实现遮罩层可以通过多种方式完成,以下是几种常见的方法: 方法一:使用 v-show 或 v-if 控制显示 通过 Vue 的指令动态控制遮罩层的显示与隐…

vue实现drag

vue实现drag

Vue 实现拖拽功能的方法 在 Vue 中实现拖拽功能可以通过原生 HTML5 的拖拽 API 或第三方库如 vuedraggable 来完成。以下是两种常见方法的实现方式。 使用 HTML5 拖拽…