【vue高频面试题】第7题:Vue3 中 `v-model` 的工作原理是什么?为什么 Vue3 支持多个 v-model?如何在子组件中实现?

Vue3 高频题 · 第 7 题

主问题

问:Vue3 中 v-model 的工作原理是什么?为什么 Vue3 支持多个 v-model?如何在子组件中实现?


一、核心回答(面试官满意版)

1)Vue3 的 v-model 实际上是 props + emit 的语法糖

在父组件中:

ini 复制代码
<Child v-model="username" />

等价于:

ini 复制代码
<Child 
  :modelValue="username" 
  @update:modelValue="val => username = val" 
/>

也就是说:

  • props:modelValue
  • emit:update:modelValue

Vue3 统一了 v-model 的名字,让逻辑更一致、更可扩展。


2)支持多个 v-model(Vue2 不支持)

Vue2 只有固定的一个 value 和事件 input

Vue3 允许:

ini 复制代码
<Child 
  v-model:title="title" 
  v-model:content="content" 
/>

等价于:

ini 复制代码
<Child
  :title="title"
  @update:title="val => title = val"

  :content="content"
  @update:content="val => content = val"
/>

二、在子组件中如何实现?(最重要)

子组件写法(script setup)

xml 复制代码
<script setup>
const props = defineProps({
  modelValue: String,
  title: String,
  content: String
})

const emit = defineEmits([
  'update:modelValue',
  'update:title',
  'update:content'
])

function changeValue(e) {
  emit('update:modelValue', e.target.value)
}
</script>

<template>
  <input :value="modelValue" @input="changeValue" />
</template>

三、Vue3 v-model 的功能增强(面试官喜欢听)

① v-model 可以做双向绑定(依旧保持 Vue2 的能力)

② v-model 不再绑定固定的 value / input

可以绑定任何属性名,如:

ini 复制代码
v-model:checked="isChecked"
v-model:current-page="page"

③ 修饰符也可以自定义(Vue3 的新特性)

ini 复制代码
<Child v-model.trim="value" />

子组件可接受:

javascript 复制代码
defineProps({
  modelValue: String,
  modelModifiers: Object
})

四、典型示例:自定义 Input 组件

父组件

ini 复制代码
<CustomInput v-model="msg" />

子组件

xml 复制代码
<script setup>
const props = defineProps(['modelValue'])
const emit = defineEmits(['update:modelValue'])

function onInput(e) {
  emit('update:modelValue', e.target.value)
}
</script>

<template>
  <input :value="modelValue" @input="onInput">
</template>

五、深度追问(面试官常考)


追问 1:v-model 在 template 中为什么不需要写 .value

因为 Vue 会自动ref 解包(unwrap)

模板中自动把 ref.value 转成普通值展示。


追问 2:v-model 为什么要用事件 update:modelValue 而不是 input?

为了避免名称冲突,并且可以支持多个 v-model。

如果使用 input/value 就不可能做多字段绑定。


追问 3:可以把 v-model 的属性名改成别的吗?

可以!

例如:

ini 复制代码
<Child v-model:visible="showDialog" />

子组件 props:

css 复制代码
defineProps(['visible'])
defineEmits(['update:visible'])

追问 4:多个 v-model 会影响性能吗?

不会。

它只是更多的 props 与 emit,没有额外开销。


六、killer 问题(高分必杀)

❓ "v-model 的原理和 provide/inject 有什么关系?"

答:没有关系!

v-model 只是父子之间最常用的"单属性双向绑定",

provide/inject 是跨层级通信,两者的作用和原理完全不同。

能回答清楚这一点,说明你能区分 Vue3 的通信场景 → 加分。


七、最终总结(1 分钟背诵版)

Vue3 的 v-model = modelValue + update:modelValue 的语法糖。

Vue3 可以绑定多个 v-model,因为事件名可动态命名。

子组件必须:

  1. 定义对应 props
  2. 定义对应 emit
  3. 事件里 emit 回去

v-model 的核心价值是规范、统一、支持多字段绑定,自定义组件必考点。

相关推荐
程序员爱钓鱼5 分钟前
Node.js 编程实战:测试与调试 —— 日志与监控方案
前端·后端·node.js
Mapmost13 分钟前
数字孪生项目效率翻倍!AI技术实测与场景验证实录
前端
小酒星小杜17 分钟前
在AI时代,技术人应该每天都要花两小时来构建一个自身的构建系统-Input篇
前端·程序员·架构
Cache技术分享25 分钟前
290. Java Stream API - 从文本文件的行创建 Stream
前端·后端
陈_杨28 分钟前
前端成功转鸿蒙开发者真实案例,教大家如何开发鸿蒙APP--ArkTS 卡片开发完全指南
前端·harmonyos
小杨同学4934 分钟前
C 语言实战:枚举类型实现数字转星期(输入 1~7 对应星期几)
前端·后端
陈_杨35 分钟前
前端成功转鸿蒙开发者真实案例,教大家如何开发鸿蒙APP--ArkTS 卡片刷新机制
前端·harmonyos
go_caipu43 分钟前
Vben Admin管理系统集成qiankun微服务(二)
前端·javascript
唐叔在学习1 小时前
insertAdjacentHTML踩坑实录:AI没搞定的问题,我给搞定啦
前端·javascript·html
超绝大帅哥1 小时前
Promise为什么比回调函数更好
前端