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

vue组件实现vmodel

<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>

使用时:

vue组件实现vmodel

<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" />

组件内部:

<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 实现屏幕共享的方法 使用 WebRTC 和 getDisplayMedia API 通过 navigator.mediaDevices.getDisplayMedia 捕获屏幕内容,结合 We…

vue实现编辑

vue实现编辑

Vue 实现编辑功能 在 Vue 中实现编辑功能通常涉及表单绑定、状态管理和事件处理。以下是一个常见的实现方法: 双向数据绑定 使用 v-model 指令实现表单元素与数据的双向绑定: <i…

vue实现频道

vue实现频道

Vue实现频道功能的方法 使用Vue Router动态路由 通过Vue Router的动态路由功能可以轻松实现频道切换。在路由配置中定义动态参数,组件内通过this.$route.params获取当前…

vue实现mouseout

vue实现mouseout

Vue 实现 mouseout 事件的方法 在 Vue 中实现 mouseout 事件可以通过多种方式完成,以下是几种常见的方法: 使用 v-on 指令 Vue 提供了 v-on 指令(或简写为 @…

vue实现Siri

vue实现Siri

Vue 实现 Siri 风格语音交互 实现类似 Siri 的语音交互功能需要结合语音识别、语音合成和前端交互逻辑。Vue 作为前端框架,可以很好地管理这些功能的交互状态。 语音识别集成 使用 Web…

vue实现ppt

vue实现ppt

Vue 实现 PPT 的功能 Vue 可以结合第三方库或自定义组件实现类似 PPT 的演示效果。以下是几种常见的方法: 使用第三方库 reveal.js reveal.js 是一个流行的演示框架,支…