当前位置:首页 > 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 事件:

vue组件实现vmodel

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. 父组件使用

    vue组件实现vmodel

    <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);
    }
  }
}

使用计算属性优化

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

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实现webapp

vue实现webapp

Vue 实现 WebApp 的基本步骤 环境准备 确保已安装 Node.js 和 npm/yarn。通过 Vue CLI 或 Vite 创建项目: npm install -g @vue/cli v…

vue实现尺子

vue实现尺子

Vue 实现尺子组件 实现一个尺子组件可以通过 Canvas 或纯 CSS 完成。以下是两种常见实现方式: 使用 Canvas 绘制尺子 通过 Canvas 动态绘制刻度线和数字,适合需要高精度或动…

vue工序实现

vue工序实现

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

vue实现卡片

vue实现卡片

Vue 实现卡片组件的方法 使用 Vue 实现卡片组件可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 HTML 和 CSS 在 Vue 单文件组件中,可以通过模板和样式直接实现卡片效果…

vue select实现搜索

vue select实现搜索

实现 Vue Select 搜索功能的方法 在 Vue 中实现 select 组件的搜索功能,可以通过原生 HTML select 结合自定义搜索逻辑,或使用第三方库如 vue-select 来实现。…

vue实现自动滚动

vue实现自动滚动

实现自动滚动的方法 在Vue中实现自动滚动可以通过多种方式完成,以下是几种常见的方法: 使用scrollTo或scrollBy方法 通过JavaScript的scrollTo或scrollBy方法…