当前位置:首页 > VUE

vue组件实现vmodel

2026-01-16 04:55:26VUE

Vue 组件实现 v-model

在 Vue 中,v-model 是双向数据绑定的语法糖,默认情况下绑定 value 属性并监听 input 事件。在自定义组件中实现 v-model 需要正确配置 propsemit

基本实现方式

  1. 定义 model 选项
    在组件内通过 model 选项指定 propevent

    export default {
      model: {
        prop: 'value', // 绑定的 prop 名
        event: 'input' // 触发的事件名
      },
      props: {
        value: String // 接收父组件传递的值
      },
      methods: {
        updateValue(newValue) {
          this.$emit('input', newValue); // 触发事件更新父组件数据
        }
      }
    }
  2. 在父组件中使用 v-model

    <template>
      <CustomInput v-model="message" />
    </template>

Vue 2.x 的替代方案

如果未显式定义 model 选项,默认使用 value 属性和 input 事件:

export default {
  props: ['value'],
  methods: {
    handleChange(e) {
      this.$emit('input', e.target.value);
    }
  }
}

Vue 3 的 v-model 实现

Vue 3 中 v-model 默认绑定 modelValue 并监听 update:modelValue 事件:

  1. 子组件定义

    export default {
      props: ['modelValue'],
      emits: ['update:modelValue'],
      methods: {
        updateValue(value) {
          this.$emit('update:modelValue', value);
        }
      }
    }
  2. 父组件使用

    <template>
      <CustomInput v-model="message" />
    </template>

支持多个 v-model 绑定(Vue 3)

Vue 3 允许为同一个组件绑定多个 v-model

<template>
  <UserForm 
    v-model:username="user.name" 
    v-model:age="user.age" 
  />
</template>

子组件需分别定义对应的 propsemits

export default {
  props: ['username', 'age'],
  emits: ['update:username', 'update:age'],
  methods: {
    updateUsername(val) {
      this.$emit('update:username', val);
    },
    updateAge(val) {
      this.$emit('update:age', val);
    }
  }
}

使用计算属性优化

对于表单控件,可以通过计算属性简化逻辑:

vue组件实现vmodel

export default {
  props: ['modelValue'],
  emits: ['update:modelValue'],
  computed: {
    value: {
      get() {
        return this.modelValue;
      },
      set(value) {
        this.$emit('update:modelValue', value);
      }
    }
  }
}

总结

  • Vue 2:默认基于 valueinput,可通过 model 选项自定义。
  • Vue 3:默认基于 modelValueupdate:modelValue,支持多 v-model
  • 通过 props 接收数据,通过 $emit 触发事件实现双向绑定。

标签: 组件vue
分享给朋友:

相关文章

vue点击实现排序

vue点击实现排序

实现点击排序的方法 在Vue中实现点击排序功能,可以通过以下几种方式完成: 使用计算属性结合排序方法 定义一个响应式数据存储排序状态,通过计算属性动态返回排序后的数组。点击事件切换排序状态。 d…

vue实现发送值接受值

vue实现发送值接受值

Vue 实现父子组件传值 父组件向子组件传值(props) 父组件通过 v-bind 或简写 : 向子组件传递数据。子组件通过 props 接收数据。 父组件代码: <template&g…

vue实现画廊

vue实现画廊

Vue实现画廊的基本方法 使用Vue.js实现画廊功能可以通过多种方式完成,以下是一种常见的实现方案: 安装必要依赖 npm install vue-gallery --save 引入组件并注册…

vue 实现循环

vue 实现循环

Vue 实现循环的方法 在 Vue 中,可以使用 v-for 指令来实现循环渲染列表数据。以下是几种常见的循环实现方式: 基本数组循环 <template> <ul>…

vue实现打印

vue实现打印

使用Vue实现打印功能 在Vue项目中实现打印功能可以通过多种方式完成,以下是几种常见的方法: 方法一:使用window.print() 这种方法适用于打印整个页面或特定区域的内容。 // 在Vu…

vue 实现穿透

vue 实现穿透

Vue 样式穿透的实现方法 在 Vue 中,样式穿透通常指在带有 scoped 属性的样式块中,强制影响子组件的样式。以下是几种常见的实现方式: 使用 >>> 或 /deep/ 选…