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

简易实现vue

简易 Vue 实现思路 核心是数据劫持结合发布-订阅模式,通过 Object.defineProperty 或 Proxy 监听数据变化,触发视图更新。 数据劫持实现 class Observer…

vue页面分离的实现

vue页面分离的实现

Vue页面分离的实现方法 将Vue页面分离为多个组件或模块,有助于提升代码可维护性和复用性。以下是几种常见的实现方式: 组件化拆分 通过将页面拆分为多个子组件,每个组件负责特定功能或UI部分。使用i…

vue实现简单的弹窗

vue实现简单的弹窗

使用 Vue 实现简单弹窗 组件基础结构 创建一个名为 Modal.vue 的组件文件,包含模板、脚本和样式部分: <template> <div class="mod…

vue自己实现下拉导航

vue自己实现下拉导航

实现下拉导航的基本思路 在Vue中实现下拉导航,可以通过结合Vue的响应式数据和事件绑定特性来完成。主要思路是利用v-show或v-if控制下拉菜单的显示与隐藏,并通过鼠标事件或点击事件触发状态变化。…

vue实现点击旋转轮盘

vue实现点击旋转轮盘

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

vue实现绑卡的原理

vue实现绑卡的原理

Vue 实现绑卡的原理 Vue 实现绑卡功能通常涉及前端表单处理、数据绑定、验证以及和后端 API 的交互。以下是实现绑卡功能的核心原理和步骤: 数据绑定与表单处理 Vue 通过 v-model 指…