自定义组件使用v-model 实现双向数据绑定

在 Vue.js 中,如果你想在一个自定义组件中使用 v-model 来实现双向数据绑定,你需要遵循一些特定的步骤。v-model 实际上是以下两个属性的语法糖:

  1. 一个名为 value 的 prop,用于接收父组件传递的数据。
  2. 一个名为 input 的事件,当子组件中的值发生变化时触发,并将新的值作为参数传递给该事件。

基本实现

假设你有一个简单的输入框组件 CustomInput,你可以这样来实现 v-model

子组件 (CustomInput.vue)
vue 复制代码
<template>
  <input
    :value="value"
    @input="$emit('input', $event.target.value)"
  >
</template>

<script>
export default {
  props: {
    // 定义 value 为必需的 prop
    value: {
      type: String,
      required: true
    }
  }
}
</script>

在这个例子中,value 是从父组件传入的 prop,而 @input 事件处理器会触发 $emit('input', ...),将新的值发送回父组件。

父组件
vue 复制代码
<template>
  <div>
    <custom-input v-model="message"></custom-input>
    <p>{{ message }}</p>
  </div>
</template>

<script>
import CustomInput from './CustomInput.vue';

export default {
  components: {
    CustomInput
  },
  data() {
    return {
      message: ''
    };
  }
}
</script>

这里,v-model 绑定了 messageCustomInput 组件上。每当用户在输入框中输入内容时,CustomInput 会通过 @input 事件更新 message

自定义 v-model 的模型名称

如果你不想使用默认的 valueinput,你可以通过 model 选项来自定义它们:

子组件 (CustomInput.vue) 使用自定义模型
vue 复制代码
<template>
  <input
    :value="customValue"
    @change="$emit('update:customValue', $event.target.value)"
  >
</template>

<script>
export default {
  props: {
    customValue: {
      type: String,
      required: true
    }
  }
}
</script>
父组件
vue 复制代码
<template>
  <div>
    <custom-input v-model:customValue="message"></custom-input>
    <p>{{ message }}</p>
  </div>
</template>

<script>
import CustomInput from './CustomInput.vue';

export default {
  components: {
    CustomInput
  },
  data() {
    return {
      message: ''
    };
  }
}
</script>

在这个例子中,我们使用了 v-model:customValue 来指定使用的 prop 名称和事件名称。注意,在子组件中,事件名需要是 update:customPropName 的形式。

以上就是如何在自定义组件中实现 v-model 的方法。通过这种方式,你可以轻松地在任何自定义组件中实现双向数据绑定。

相关推荐
Cobyte37 分钟前
21.Vue Vapor 组件的实现原理
前端·javascript·vue.js
橙某人40 分钟前
LogicFlow 工作流撤销与重做:从「全量快照」到「命令模式」🎯
前端·vue.js
铁皮饭盒1 小时前
Rust版Bun1.4之前, 盘点Bun1.3新特性
前端·javascript·后端
晓得迷路了1 小时前
栗子前端技术周刊第 135 期 - Vite 8.1、Rspack 2.1、Babel 8.0...
前端·javascript·vite
To_OC10 小时前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC10 小时前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
天渺工作室10 小时前
实现一个adblock/adblock plus等浏览器广告拦截器检测插件
前端·javascript
ZhengEnCi11 小时前
Q04-Vite禁用CSS代码分割-解决生产环境样式加载顺序混乱问题
前端·vue.js·vite
kyriewen18 小时前
2026 年了,还在用 Node.js?Bun 迁移实战:20 分钟搞定,附踩坑记录
前端·javascript·node.js
minglie1 天前
一个置换问题
javascript