在Vue3中,如何在父组件中使用v-model与子组件进行双向绑定?

在 Vue 3 里,借助 v-model 可以轻松实现父组件与子组件的双向绑定。以下为你详细介绍实现步骤与示例代码。

实现原理

v-model 在 Vue 3 里是一种语法糖,它本质上是 :modelValue@update:modelValue 的组合。父组件借助 :modelValue 向子组件传递数据,子组件则通过 @update:modelValue 事件把数据变化反馈给父组件。

示例代码

子组件(ChildComponent.vue

vue

复制代码
<template>
  <div>
    <!-- 输入框绑定到 localValue -->
    <input v-model="localValue" type="text" />
  </div>
</template>

<script setup>
import { ref, watch } from 'vue';
// 定义接收的 prop
const props = defineProps({
  modelValue: String
});
// 定义触发的事件
const emit = defineEmits(['update:modelValue']);

// 创建一个本地响应式变量,初始值为父组件传递的 modelValue
const localValue = ref(props.modelValue);

// 监听 localValue 的变化
watch(localValue, (newValue) => {
  // 当 localValue 变化时,触发 update:modelValue 事件通知父组件
  emit('update:modelValue', newValue);
});
</script>
父组件(ParentComponent.vue

vue

复制代码
<template>
  <div>
    <!-- 使用 v-model 绑定到 parentData -->
    <ChildComponent v-model="parentData" />
    <!-- 显示父组件的数据 -->
    <p>父组件中的数据: {{ parentData }}</p>
  </div>
</template>

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

// 创建父组件的响应式数据
const parentData = ref('初始数据');
</script>

代码解释

子组件
  • defineProps :定义接收的 props,这里接收 modelValue 作为输入值。
  • defineEmits :定义可以触发的事件,这里定义了 update:modelValue 事件。
  • localValue :创建一个本地的响应式变量,初始值为父组件传递的 modelValue
  • watch :监听 localValue 的变化,当它发生变化时,触发 update:modelValue 事件并将新值传递给父组件。
父组件
  • v-model :使用 v-model 指令将 parentData 绑定到子组件。
  • parentData:创建一个响应式数据,用于存储和显示数据。

v-model 绑定

如果你需要在子组件中支持多个 v-model 绑定,可以为不同的 propsemits 事件设置不同的名称。

子组件(支持多个 v-model

vue

复制代码
<template>
  <div>
    <input v-model="textValue" type="text" />
    <input v-model="numberValue" type="number" />
  </div>
</template>

<script setup>
import { ref, watch } from 'vue';
// 定义接收的 props
const props = defineProps({
  textModelValue: { default: '' },
  numberModelValue: { default: 0 }
});
// 定义触发的事件
const emit = defineEmits([
  'update:textModelValue',
  'update:numberModelValue'
]);

// 创建本地响应式变量
const textValue = ref(props.textModelValue);
const numberValue = ref(props.numberModelValue);

// 监听 textValue 的变化
watch(textValue, (newValue) => {
  // 当 textValue 变化时,触发 update:textModelValue 事件通知父组件
  emit('update:textModelValue', newValue);
});

// 监听 numberValue 的变化
watch(numberValue, (newValue) => {
  // 当 numberValue 变化时,触发 update:numberModelValue 事件通知父组件
  emit('update:numberModelValue', newValue);
});
</script>
父组件(使用多个 v-model

vue

复制代码
<template>
  <div>
    <!-- 使用 v-model:text 和 v-model:number 分别绑定到 textData 和 numberData -->
    <ChildComponent
      v-model:text="textData"
      v-model:number="numberData"
    />
    <!-- 显示父组件的文本数据 -->
    <p>文本数据: {{ textData }}</p>
    <!-- 显示父组件的数值数据 -->
    <p>数值数据: {{ numberData }}</p>
  </div>
</template>

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

// 创建父组件的响应式数据
const textData = ref('');
const numberData = ref(0);
</script>

总结

通过以上步骤,你可以在 Vue 3 中实现父组件与子组件的双向绑定。使用 v-model 可以让代码更加简洁和易于维护。

相关推荐
To_OC6 小时前
别再串行写 await 了,Promise.all 才是并行请求的正确打开方式
前端·javascript·promise
To_OC6 小时前
LC 17 电话号码的字母组合:我的回溯算法,就是从这道题开窍的
javascript·算法·leetcode
vipbic6 小时前
中后台越做越乱后,我用插件化把它救回来了
前端·vue.js
Hyyy6 小时前
Computer Use 适合做什么,不适合做什么——一次真实使用后的思考
前端
小和尚同志6 小时前
前端 AI 单元测试思考与落地
前端·人工智能·aigc
invicinble8 小时前
c端系统,其实更像一个信息展示平台
前端
你怎么知道我是队长8 小时前
JavaScript的变量和数据类型介绍
开发语言·javascript·ecmascript
李姆斯8 小时前
管理是否可以被完全量化
前端·产品经理·团队管理
名字还没想好☜9 小时前
Next.js 中间件实战:鉴权、重定向与 A/B 分流
开发语言·前端·javascript·中间件·react·next.js
广州灵眸科技有限公司9 小时前
瑞芯微RV1126B开发板(EASY-EAI-PI2) INI文件操作
java·前端·javascript·网络·人工智能