当前位置:首页 > 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 实现日历的基本方法 使用 Vue 实现日历可以通过自定义组件或借助第三方库完成。以下是两种常见实现方式: 自定义日历组件 创建基于 Vue 的日历组件需要处理日期计算和渲染逻辑。核心是生成当…

vue实现增加

vue实现增加

实现 Vue 中的新增功能 在 Vue 中实现新增功能通常涉及数据绑定、表单处理和状态管理。以下是几种常见的实现方式: 数据绑定与列表渲染 通过 v-model 绑定表单输入,使用数组的 push…

vue工序实现

vue工序实现

Vue 工序实现方法 在Vue中实现工序(或流程)功能,通常涉及状态管理、组件通信和动态渲染。以下是几种常见方法: 使用动态组件 通过Vue的<component :is="currentCo…

vue实现滚动显示

vue实现滚动显示

Vue 实现滚动显示的几种方法 在 Vue 中实现滚动显示可以通过多种方式实现,以下是几种常见的方法: 使用 CSS 动画 通过 CSS 的 animation 属性结合 @keyframes 实现…

vue实现语音播报

vue实现语音播报

实现语音播报的基本方法 在Vue中实现语音播报功能,可以通过Web Speech API中的SpeechSynthesis接口来完成。该接口允许开发者将文本转换为语音并播放。 使用SpeechSyn…

vue实现的setdata

vue实现的setdata

Vue 中实现类似小程序 setData 的方法 在小程序中,setData 方法用于异步更新页面数据并触发视图渲染。Vue 中可以通过以下几种方式实现类似功能: 直接使用 Vue 的响应式系统 V…