当前位置:首页 > VUE

vue 组件实现v model

2026-01-21 04:31:06VUE

Vue 组件实现 v-model

在 Vue 中,v-model 是双向绑定的语法糖,通常用于表单元素。自定义组件也可以通过实现 v-model 来支持双向绑定。

基本实现方式

默认情况下,v-model 在组件上使用 value 作为 prop,input 作为事件。可以通过以下方式实现:

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

<script>
export default {
  data() {
    return {
      message: ''
    }
  }
}
</script>
<!-- 子组件 CustomInput -->
<template>
  <input
    :value="value"
    @input="$emit('input', $event.target.value)"
  />
</template>

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

自定义 prop 和事件

Vue 2.4+ 允许自定义 v-model 的 prop 和事件名称:

vue 组件实现v model

<!-- 父组件 -->
<template>
  <CustomInput v-model="message" />
</template>
<!-- 子组件 CustomInput -->
<template>
  <input
    :value="text"
    @input="$emit('update', $event.target.value)"
  />
</template>

<script>
export default {
  model: {
    prop: 'text',
    event: 'update'
  },
  props: ['text']
}
</script>

Vue 3 中的变化

Vue 3 中 v-model 的默认行为有所改变:

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

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

多个 v-model 绑定

Vue 3 支持在单个组件上使用多个 v-model

vue 组件实现v model

<!-- 父组件 -->
<template>
  <UserForm
    v-model:name="userName"
    v-model:email="userEmail"
  />
</template>
<!-- 子组件 UserForm -->
<template>
  <input
    :value="name"
    @input="$emit('update:name', $event.target.value)"
  />
  <input
    :value="email"
    @input="$emit('update:email', $event.target.value)"
  />
</template>

<script>
export default {
  props: ['name', 'email'],
  emits: ['update:name', 'update:email']
}
</script>

使用计算属性

对于更复杂的逻辑,可以在子组件中使用计算属性:

<!-- 子组件 -->
<template>
  <input v-model="internalValue" />
</template>

<script>
export default {
  props: ['value'],
  computed: {
    internalValue: {
      get() {
        return this.value
      },
      set(val) {
        this.$emit('input', val)
      }
    }
  }
}
</script>

处理修饰符

可以处理 v-model 修饰符:

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

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

通过以上方法,可以在 Vue 组件中灵活实现 v-model 功能,满足各种双向绑定的需求。

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

相关文章

vue设计与实现目录

vue设计与实现目录

以下是《Vue设计与实现》一书的典型目录结构(根据常见技术书籍及Vue核心内容整理): 响应式系统 响应式数据的基本原理 依赖收集与触发更新 实现简易响应式系统 Proxy与Refle…

vue异步组建实现原理

vue异步组建实现原理

Vue 异步组件实现原理 Vue 的异步组件允许将组件按需加载,通常用于代码分割或延迟加载非关键组件。其核心原理基于 Promise 和动态导入。 基本实现方式 通过 defineAsyncComp…

vue 路由 实现

vue 路由 实现

Vue 路由实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue 路由的详细步骤: 安装 Vue Router 通过 npm 或 ya…

vue实现过滤

vue实现过滤

Vue实现过滤的方法 在Vue中实现数据过滤可以通过多种方式完成,以下是几种常见的方法: 使用计算属性过滤 计算属性是Vue中处理数据过滤的理想选择,它们基于响应式依赖进行缓存,只有在相关依赖发生改…

vue插槽实现

vue插槽实现

插槽的基本概念 Vue插槽(Slot)是一种内容分发机制,允许父组件向子组件传递模板片段,子组件通过<slot>标签定义接收位置。插槽的核心作用是增强组件的灵活性和复用性。 默认插槽 子…

vue实现排序

vue实现排序

Vue 实现排序的方法 在 Vue 中实现排序可以通过多种方式完成,以下是一些常见的方法: 使用计算属性排序数组 计算属性非常适合对数据进行排序,因为它会在依赖的数据变化时自动更新。以下是一个示例…