当前位置:首页 > VUE

vue组件实现vmodel

2026-03-29 05:23:59VUE

实现 v-model 的双向绑定

在 Vue 中,v-model 是一个语法糖,用于在组件上实现双向数据绑定。默认情况下,v-model 在组件上会利用 value prop 和 input 事件,但可以通过 model 选项进行自定义。

基本实现方式:

<template>
  <input
    :value="value"
    @input="$emit('input', $event.target.value)"
  >
</template>

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

自定义 model 选项:

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

<template>
  <input
    :checked="checked"
    @change="$emit('change', $event.target.checked)"
  >
</template>

<script>
export default {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: ['checked']
}
</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

Vue 2.x 默认只支持单个 v-model,但可以通过自定义 prop 和事件实现多个双向绑定:

<template>
  <input
    :value="firstName"
    @input="$emit('update:firstName', $event.target.value)"
  >
  <input
    :value="lastName"
    @input="$emit('update:lastName', $event.target.value)"
  >
</template>

<script>
export default {
  props: ['firstName', 'lastName']
}
</script>

使用时:

<my-component
  :firstName.sync="user.firstName"
  :lastName.sync="user.lastName"
/>

Vue 3 中的变化

Vue 3 对 v-model 进行了改进,支持多个 v-model 绑定并移除了 .sync 修饰符:

<template>
  <input
    :modelValue="modelValue"
    @update:modelValue="$emit('update:modelValue', $event)"
  >
</template>

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

多个 v-model 绑定示例:

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

组件内部:

vue组件实现vmodel

<template>
  <input
    :value="firstName"
    @input="$emit('update:firstName', $event.target.value)"
  >
  <input
    :value="lastName"
    @input="$emit('update:lastName', $event.target.value)"
  >
</template>

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

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

相关文章

vue异步组建实现原理

vue异步组建实现原理

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

vue 组件实现

vue 组件实现

Vue 组件实现方法 单文件组件 (SFC) 使用 .vue 文件格式,包含模板、脚本和样式三部分: <template> <div class="example">{{…

tabbar 实现 vue

tabbar 实现 vue

在 Vue 中实现 TabBar 功能可以通过多种方式完成,以下是几种常见的方法: 使用 Vue Router 结合自定义组件 创建一个自定义的 TabBar 组件,结合 Vue Router 实现…

vue 实现href

vue 实现href

Vue 实现 href 的方法 在 Vue 中实现 href 功能可以通过多种方式,具体取决于需求场景。以下是几种常见的方法: 使用 <a> 标签 直接使用 HTML 的 <a&g…

vue实现注销

vue实现注销

实现用户注销功能 在Vue应用中实现用户注销功能通常涉及清除用户会话、重置应用状态并跳转到登录页面。以下是具体实现方法: 清除用户认证信息 使用Vuex或Pinia管理用户状态时,需在注销时重置存储…

vue实现treeview

vue实现treeview

Vue 实现 TreeView 的方法 使用递归组件实现 TreeView 递归组件是 Vue 中实现 TreeView 的常见方式。通过组件调用自身,可以轻松处理嵌套的树形结构数据。 <te…