当前位置:首页 > VUE

vue组件v model实现

2026-02-24 12:28:06VUE

Vue 组件实现 v-model

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

基本实现方式

自定义组件中实现 v-model 需要定义一个 value prop 并在数据变化时触发 input 事件。

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

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

父组件中使用方式:

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

自定义 prop 和事件

如果需要修改默认的 value prop 和 input 事件,可以在组件中通过 model 选项配置。

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

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

父组件中使用方式:

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

使用计算属性

对于更复杂的逻辑,可以使用计算属性来处理双向绑定。

<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.4+)

在 Vue 2.4 及以上版本,可以通过 .sync 修饰符实现多个属性的双向绑定。

子组件:

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

<script>
export default {
  props: ['title', 'content']
}
</script>

父组件中使用方式:

<custom-input
  :title.sync="postTitle"
  :content.sync="postContent"
></custom-input>

Vue 3 中的变化

在 Vue 3 中,v-model 的默认 prop 从 value 改为 modelValue,事件从 input 改为 update:modelValue。同时支持多个 v-model 绑定。

子组件:

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

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

父组件中使用方式:

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

多个 v-model 绑定:

vue组件v model实现

<custom-input
  v-model:title="postTitle"
  v-model:content="postContent"
></custom-input>

通过以上方法,可以灵活地在 Vue 组件中实现 v-model 功能,满足不同的业务需求。

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

相关文章

django vue实现

django vue实现

Django与Vue.js整合实现方案 Django作为后端框架与Vue.js作为前端框架的整合,可以通过以下方式实现: 分离式开发 前后端完全分离,Django仅提供API接口,Vue.js通过a…

vue实现grid

vue实现grid

Vue 实现 Grid 布局的方法 使用 CSS Grid 布局 Vue 可以结合 CSS Grid 布局实现灵活的网格系统。CSS Grid 是现代浏览器原生支持的布局方案,无需额外依赖库。 &l…

vue实现handsontable

vue实现handsontable

Vue 中实现 Handsontable 要在 Vue 项目中集成 Handsontable,可以使用官方提供的 @handsontable/vue 封装库。以下是一个完整的实现步骤。 安装依赖 确…

vue 实现过滤

vue 实现过滤

Vue 实现过滤的方法 在 Vue 中实现过滤功能可以通过多种方式完成,包括使用计算属性、自定义过滤器、第三方库等。以下是几种常见的实现方法: 使用计算属性进行过滤 计算属性是 Vue 中最常用的过…

vue搜索实现

vue搜索实现

Vue 搜索功能实现方法 基于计算属性的搜索 在 Vue 中可以通过计算属性实现简单的搜索功能。这种方式适合小型数据集,利用 JavaScript 的 filter 方法进行筛选。 data() {…

vue实现链接

vue实现链接

Vue 实现链接的方法 在 Vue 中实现链接可以通过多种方式,包括使用 <router-link>、<a> 标签或编程式导航。以下是几种常见的方法: 使用 <rout…