当前位置: 首页 > article >正文

子组件如何通过v-model实现数据的双向绑定

在 Vue 中,v-model 是一种语法糖,用于在表单元素或者组件上实现双向数据绑定。

下面分别介绍在 Vue 2 和 Vue 3 里子组件使用 v-model 实现数据双向绑定的具体方式。

Vue 2 中使用 v-model 实现双向绑定

在 Vue 2 里,v-model 本质上是 :value@input 的语法糖。子组件需要接收 value 属性,并在数据变化时触发 input 事件。

父组件示例
<template>
  <div>
    <!-- 父组件数据 -->
    <p>父组件的值: {{ parentData }}</p>
    <!-- 使用 v-model 绑定到子组件 -->
    <ChildComponent v-model="parentData" />
  </div>
</template>

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

export default {
  components: {
    ChildComponent
  },
  data() {
    return {
      parentData: ''
    };
  }
};
</script>
子组件示例
<template>
  <div>
    <!-- 绑定输入框的值到 value 属性 -->
    <input :value="value" @input="updateValue($event.target.value)" />
  </div>
</template>

<script>
export default {
  // 接收父组件传来的 value 属性
  props: ['value'],
  methods: {
    updateValue(newValue) {
      // 触发 input 事件,将新值传递给父组件
      this.$emit('input', newValue);
    }
  }
};
</script>

代码解释

  • 父组件:使用 v-modelparentData 绑定到 ChildComponent 上。
  • 子组件
    • 通过 props 接收 value 属性,用于显示输入框的值。
    • 当输入框的值发生变化时,调用 updateValue 方法,在该方法里使用 $emit('input', newValue) 触发 input 事件,将新值传递给父组件。

Vue 3 中使用 v-model 实现双向绑定

在 Vue 3 中,v-model 对应的 prop 默认是 modelValue,事件是 update:modelValue。同时,使用 <script setup> 语法糖可以让代码更简洁。

父组件示例
<template>
  <div>
    <!-- 父组件数据 -->
    <p>父组件的值: {{ parentData }}</p>
    <!-- 使用 v-model 绑定到子组件 -->
    <ChildComponent v-model="parentData" />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

// 定义响应式数据
const parentData = ref('');
</script>
子组件示例(使用 <script setup>
<template>
  <div>
    <!-- 绑定输入框的值到 modelValue -->
    <input :value="modelValue" @input="updateValue($event.target.value)" />
  </div>
</template>

<script setup>
import { defineProps, defineEmits } from 'vue';

// 定义 props 接收 modelValue
const props = defineProps(['modelValue']);
// 定义可以触发的事件
const emits = defineEmits(['update:modelValue']);

const updateValue = (newValue) => {
  // 触发 update:modelValue 事件,将新值传递给父组件
  emits('update:modelValue', newValue);
};
</script>

代码解释

  • 父组件:使用 v-modelparentData 绑定到 ChildComponent 上。
  • 子组件
    • 使用 defineProps 接收 modelValue 属性。
    • 使用 defineEmits 定义 update:modelValue 事件。
    • 当输入框的值发生变化时,调用 updateValue 方法,在该方法里使用 emits('update:modelValue', newValue) 触发事件,将新值传递给父组件。

v-model 绑定(Vue 3.4+)

Vue 3.4 及以上版本支持多个 v-model 绑定,允许子组件同时处理多个双向绑定的数据。

父组件示例
<template>
  <div>
    <p>父组件的标题: {{ title }}</p>
    <p>父组件的内容: {{ content }}</p>
    <!-- 使用多个 v-model 绑定到子组件 -->
    <ChildComponent v-model:title="title" v-model:content="content" />
  </div>
</template>

<script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';

const title = ref('');
const content = ref('');
</script>
子组件示例(使用 <script setup>
<template>
  <div>
    <input :value="title" @input="updateTitle($event.target.value)" />
    <textarea :value="content" @input="updateContent($event.target.value)" />
  </div>
</template>

<script setup>
import { defineProps, defineEmits } from 'vue';

// 定义 props 接收多个 v-model 的值
const props = defineProps(['title', 'content']);
// 定义可以触发的事件
const emits = defineEmits(['update:title', 'update:content']);

const updateTitle = (newTitle) => {
  emits('update:title', newTitle);
};

const updateContent = (newContent) => {
  emits('update:content', newContent);
};
</script>

通过以上方式,就能在子组件中使用 v-model 实现数据的双向绑定,无论是 Vue 2 还是 Vue 3 都能根据具体需求灵活运用。


http://www.kler.cn/a/563650.html

相关文章:

  • Holoens2开发报错记录02_通过主机获取彩色和深度数据流常见错误
  • Java 面试篇-Redis 专题
  • Django项目开发的网站展示来自fasta文件的蛋白质名称和序列的可视化表格
  • 【FL0091】基于SSM和微信小程序的社区二手物品交易小程序
  • androidstudio 运行项目加载很慢,优化方法
  • 什么是大语言模型
  • nodejs用ws模块反向代理socks5数据,即用ws写服务端和客户端及加密
  • Dify私有化部署自己的AI Agent
  • 【工作流】Spring Boot 项目与 Camunda 的整合
  • Gartner发布安全地响应 DeepSeek指南:DeepSeek相关关键安全挑战及其安全控制措施
  • TS二次封装axios学习总结
  • 开源模型应用落地-DeepSeek-R1-Distill-Qwen-7B-Docker助力-模型部署 “光速” 指南
  • Linux下原子操作`__atomic_store_n`和`__atomic_load_n`的消耗问题
  • 验证码介绍及生成与验证(HTML + JavaScript实现)
  • Python爬取某云热歌榜:解析动态加载的歌曲数据
  • AI安全相关漏洞
  • 朴素贝叶斯分类
  • Maven+SSM+SpringBoot+Mybatis-Plus
  • 50周学习go语言:第四周 函数与错误处理深度解析
  • Python 网络爬虫实战全解析:案例驱动的技术探索