当前位置:首页 > VUE

vue组件实现v model

2026-02-24 10:19:08VUE

Vue 组件实现 v-model

在 Vue 中,v-model 是一个语法糖,用于在表单元素上实现双向数据绑定。在自定义组件中,可以通过 model 选项和 $emit 方法实现类似的功能。

基本实现方式

自定义组件中需要定义一个 value prop 用于接收父组件传递的值,并通过 input 事件将修改后的值传递回父组件。

// 子组件
Vue.component('custom-input', {
  props: ['value'],
  template: `
    <input
      :value="value"
      @input="$emit('input', $event.target.value)"
    >
  `
})

父组件中使用 v-model 绑定数据:

// 父组件
new Vue({
  el: '#app',
  data: {
    message: ''
  },
  template: `
    <div>
      <custom-input v-model="message"></custom-input>
      <p>{{ message }}</p>
    </div>
  `
})

使用 model 选项

如果需要修改默认的 prop 和事件名称,可以使用 model 选项:

Vue.component('custom-checkbox', {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: {
    checked: Boolean
  },
  template: `
    <input
      type="checkbox"
      :checked="checked"
      @change="$emit('change', $event.target.checked)"
    >
  `
})

父组件中使用方式不变:

<custom-checkbox v-model="isChecked"></custom-checkbox>

计算属性实现复杂逻辑

对于需要复杂处理的场景,可以在组件内部使用计算属性:

Vue.component('custom-input', {
  props: ['value'],
  computed: {
    internalValue: {
      get() {
        return this.value
      },
      set(val) {
        this.$emit('input', val)
      }
    }
  },
  template: `
    <input v-model="internalValue">
  `
})

修饰符处理

自定义组件可以支持 v-model 修饰符,通过 model 选项的 modifiers 属性访问:

Vue.component('custom-input', {
  props: ['value', 'modifiers'],
  created() {
    console.log(this.modifiers) // 例如 { lazy: true }
  },
  template: `
    <input
      :value="value"
      @input="$emit('input', $event.target.value)"
    >
  `
})

使用带修饰符的 v-model

<custom-input v-model.lazy="message"></custom-input>

Vue 3 中的变化

在 Vue 3 中,v-model 的实现有所变化,支持多个 v-model 绑定:

// 子组件
app.component('custom-input', {
  props: ['modelValue'],
  emits: ['update:modelValue'],
  template: `
    <input
      :value="modelValue"
      @input="$emit('update:modelValue', $event.target.value)"
    >
  `
})

父组件中使用:

<custom-input v-model="message"></custom-input>

对于多个 v-model 绑定:

<user-name
  v-model:first-name="firstName"
  v-model:last-name="lastName"
></user-name>

子组件需要分别处理:

vue组件实现v model

app.component('user-name', {
  props: {
    firstName: String,
    lastName: String
  },
  emits: ['update:firstName', 'update:lastName'],
  template: `
    <input
      type="text"
      :value="firstName"
      @input="$emit('update:firstName', $event.target.value)"
    >
    <input
      type="text"
      :value="lastName"
      @input="$emit('update:lastName', $event.target.value)"
    >
  `
})

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

相关文章

vue实现tab换行

vue实现tab换行

Vue实现Tab切换的常见方法 使用Vue实现Tab切换功能可以通过多种方式完成,以下是几种常见的方法: 动态组件结合v-if或v-show 通过v-if或v-show控制不同Tab内容的显示与隐…

vue实现查询替换

vue实现查询替换

Vue 实现查询替换功能 在 Vue 中实现查询替换功能,可以通过数据绑定和字符串操作方法结合实现。以下是具体实现方式: 基础实现 <template> <div>…

vue实现贴图

vue实现贴图

Vue 实现贴图功能 在Vue中实现贴图功能通常涉及将图片动态添加到指定位置或元素上。以下是几种常见实现方式: 使用v-bind动态绑定图片 通过数据驱动的方式动态更换图片源: <templ…

vue 实现图钉

vue 实现图钉

实现图钉效果的步骤 在Vue中实现图钉(固定位置)效果,可以通过CSS的position: sticky属性或监听滚动事件动态修改元素样式。以下是两种常见方法: 方法一:使用CSS的position…

vue实现tabs

vue实现tabs

Vue实现Tabs组件的方法 使用动态组件和v-for指令 在Vue中创建Tabs组件可以通过动态组件和v-for指令实现。定义一个包含tab标题和内容的数组,使用v-for渲染tab标题,并通过点击…

vue实现openoffice

vue实现openoffice

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