自定义组件使用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 的方法。通过这种方式,你可以轻松地在任何自定义组件中实现双向数据绑定。

相关推荐
西瓜_号码12 分钟前
React中Redux基础和路由介绍
javascript·react.js·ecmascript
A了LONE1 小时前
h5的底部导航栏模板
java·前端·javascript
轻语呢喃1 小时前
JavaScript :事件循环机制的深度解析
javascript·后端
摆烂为不摆烂1 小时前
😁深入JS(六): 一文让你完全理解浏览器进程与线程
前端·javascript
我血条子呢2 小时前
动态组件和插槽
前端·javascript·vue.js
前端付豪2 小时前
13、表格系统架构:列配置、嵌套数据、复杂交互
前端·javascript·架构
南屿im2 小时前
发布订阅模式和观察者模式傻傻分不清?一文搞懂两大设计模式
前端·javascript
JustHappy2 小时前
SPA?MPA?有啥关系?有啥区别?聊一聊页面形态 or 路由模式
前端·javascript·架构
每天开心2 小时前
🧙‍♂️闭包应用场景之--防抖和节流
前端·javascript·面试
归于尽2 小时前
Generator?从 yield 卡壳,到终于搞懂协程那点事
前端·javascript