当前位置:首页 > VUE

vue实现vmodel

2026-03-07 14:42:36VUE

Vue 实现 v-model 双向绑定

在 Vue 中,v-model 是一个语法糖,用于在表单元素或组件上实现双向数据绑定。以下是不同场景下的实现方法:

在表单元素上使用 v-model

对于原生表单元素(如 inputtextareaselect),v-model 会自动绑定 value 属性并监听 input 事件:

<template>
  <input v-model="message" placeholder="Edit me">
  <p>Message is: {{ message }}</p>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    }
  }
}
</script>

在自定义组件上实现 v-model

在 Vue 2.x 中,自定义组件需要通过 value prop 和 input 事件实现:

vue实现vmodel

<!-- 父组件 -->
<template>
  <CustomInput v-model="message"/>
</template>

<script>
export default {
  data() {
    return {
      message: ''
    }
  }
}
</script>

<!-- 子组件 CustomInput.vue -->
<template>
  <input 
    :value="value" 
    @input="$emit('input', $event.target.value)"
  >
</template>

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

在 Vue 3.x 中,v-model 的实现有所变化,使用 modelValue prop 和 update:modelValue 事件:

<!-- 父组件 -->
<template>
  <CustomInput v-model="message"/>
</template>

<!-- 子组件 CustomInput.vue -->
<template>
  <input
    :value="modelValue"
    @input="$emit('update:modelValue', $event.target.value)"
  >
</template>

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

实现多个 v-model 绑定

Vue 3.x 支持为单个组件绑定多个 v-model

vue实现vmodel

<!-- 父组件 -->
<template>
  <UserForm
    v-model:username="username"
    v-model:password="password"
  />
</template>

<!-- 子组件 UserForm.vue -->
<template>
  <input
    :value="username"
    @input="$emit('update:username', $event.target.value)"
  >
  <input
    :value="password"
    @input="$emit('update:password', $event.target.value)"
  >
</template>

<script>
export default {
  props: ['username', 'password']
}
</script>

自定义 v-model 修饰符

可以创建自定义修饰符来处理输入值:

<!-- 父组件 -->
<template>
  <CustomInput v-model.capitalize="text"/>
</template>

<!-- 子组件 CustomInput.vue -->
<template>
  <input
    :value="modelValue"
    @input="emitValue"
  >
</template>

<script>
export default {
  props: {
    modelValue: String,
    modelModifiers: {
      default: () => ({})
    }
  },
  methods: {
    emitValue(e) {
      let value = e.target.value
      if (this.modelModifiers.capitalize) {
        value = value.charAt(0).toUpperCase() + value.slice(1)
      }
      this.$emit('update:modelValue', value)
    }
  }
}
</script>

使用计算属性实现复杂逻辑

对于需要复杂处理的绑定,可以结合计算属性:

<template>
  <input v-model="computedValue">
</template>

<script>
export default {
  props: ['modelValue'],
  computed: {
    computedValue: {
      get() {
        return this.modelValue
      },
      set(value) {
        this.$emit('update:modelValue', value.trim())
      }
    }
  }
}
</script>

以上方法覆盖了 Vue 中实现 v-model 的主要场景,从基础表单绑定到自定义组件的高级用法。根据项目使用的 Vue 版本(2.x 或 3.x)选择对应的实现方式。

标签: vuevmodel
分享给朋友:

相关文章

vue 实现pc

vue 实现pc

Vue 实现 PC 端应用的核心要点 Vue.js 是一个渐进式框架,适合构建 PC 端单页应用(SPA)或复杂的前端界面。以下是实现 PC 端应用的关键方法和注意事项: 项目初始化与工程化配置 使…

vue实现公式

vue实现公式

在Vue中实现公式展示或计算可以通过多种方式实现,以下为具体方法: 使用模板插值与计算属性 若公式较简单,可直接在模板中使用插值表达式或计算属性。例如计算圆的面积: <template>…

vue实现bootstrap

vue实现bootstrap

Vue 中集成 Bootstrap 的方法 在 Vue 项目中集成 Bootstrap 可以通过以下方式实现,涵盖样式、组件和交互功能。 安装 Bootstrap 依赖 通过 npm 或 yarn…

vue翻页实现

vue翻页实现

Vue翻页实现方法 基础分页组件实现 使用v-for和计算属性实现基础分页逻辑: <template> <div> <ul> <li…

vue实现tree

vue实现tree

Vue 实现 Tree 组件 使用 Vue 实现 Tree 组件可以通过递归组件的方式来实现层级结构展示。以下是一个完整的实现方法: 基础递归组件实现 创建 Tree 组件文件 Tree.vue,使…

vue实现openoffice

vue实现openoffice

Vue 中集成 OpenOffice 的实现方法 在 Vue 项目中集成 OpenOffice 通常需要通过后端服务或现有库实现文档的预览和编辑功能。以下是几种常见的实现方式: 使用 OnlyOff…