Vue3 新特性defineModel用法如何让 v-model 写法更优雅

 更新时间:2025年08月28日 11:33:19   作者:编程随想_Code  
Vue3.3新增defineModel语法糖,简化v-model双向绑定,子组件通过声明响应式变量直接与父组件绑定,无需props+emit,本文给大家介绍Vue3 新特性defineModel用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

一、前言

在 Vue3.3 版本中,官方新增了一个非常实用的语法糖 —— defineModel。它的主要作用是让我们在组件中更方便地使用 v-model,简化了以往繁琐的写法。
如果你之前写过 Vue2 或 Vue3 的组件,应该对 props + emit 结合 v-model 的写法很熟悉。但这种写法相对麻烦,而 defineModel 正是为了解决这个问题而生的。

二、回顾传统v-model用法

在 Vue3 中,父子组件传递双向绑定一般是这样写的:

子组件(传统写法)

<script setup>
import { defineProps, defineEmits } from 'vue'
const props = defineProps({
  modelValue: String
})
const emit = defineEmits(['update:modelValue'])
function onInput(e) {
  emit('update:modelValue', e.target.value)
}
</script>
<template>
  <input :value="props.modelValue" @input="onInput" />
</template>

父组件

<script setup>
import ChildInput from './ChildInput.vue'
import { ref } from 'vue'
const text = ref('')
</script>
<template>
  <ChildInput v-model="text" />
  <p>父组件里的值:{{ text }}</p>
</template>

可以看到:

  • 子组件需要写 propsemit,再手动触发 update:modelValue
  • 写起来比较繁琐,不够直观。

三、defineModel的出现

Vue3.3 引入的 defineModel 大大简化了这个流程。它让子组件可以直接声明一个 响应式变量,这个变量就自动和 v-model 绑定。

子组件(使用defineModel)

<script setup>
const modelValue = defineModel()
</script>
<template>
  <input v-model="modelValue" />
</template>

是不是简单很多?

  • 不再需要 definePropsdefineEmits
  • 直接用一个变量就能完成父子双向绑定。

四、defineModel的进阶用法

1. 指定类型

<script setup lang="ts">
const modelValue = defineModel<string>()
</script>

这样在 TS 下会有更好的类型提示。

2. 自定义prop名称

默认情况下,defineModel() 对应的就是 v-model(即 modelValue)。
但如果你想用多个 v-model,也可以给它起名字:

<script setup>
const title = defineModel('title')
const content = defineModel('content')
</script>
<template>
  <input v-model="title" placeholder="标题"/>
  <textarea v-model="content" placeholder="内容"></textarea>
</template>
父组件这样用:
<ArticleEditor v-model:title="postTitle" v-model:content="postContent" />

3. 添加默认值和校验规则

defineModel 也支持和 defineProps 类似的配置:

<script setup>
const modelValue = defineModel({
  type: String,
  default: 'Hello Vue3',
  required: true
})
</script>

这样可以确保绑定的值有默认值,也能做一些简单的类型校验。

五、defineModel的优缺点

优点

  • 极简写法 —— 不用再写 props + emit
  • 语义清晰 —— 一眼就能看出这是 v-model 绑定的值。
  • 支持多 v-model —— 写起来比原生的 props + emit 更直观。

缺点

  • 只在 Vue3.3+ 可用,老版本不支持。
  • 对于复杂的业务逻辑,可能还是需要 props + emit 来处理更灵活的场景。

六、适用场景

  • 表单类组件(输入框、选择器、弹窗开关等)。
  • 需要多个 v-model 的复杂组件(如富文本编辑器:v-model:valuev-model:config)。
  • 需要简化组件写法的场景。

七、总结

defineModel 是 Vue3.3 之后提供的一个语法糖,它让我们在子组件中使用 v-model 更加简洁高效:

  • 不需要再写 propsemit
  • 可以直接定义一个响应式变量和父组件双向绑定。
  • 支持类型、默认值、多 v-model

如果你项目的 Vue 版本在 3.3 以上,强烈推荐用起来!

到此这篇关于Vue3 新特性defineModel用法如何让 v-model 写法更优雅的文章就介绍到这了,更多相关vue defineModel 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Vite构建Vue3项目的流程步骤

    使用Vite构建Vue3项目的流程步骤

    在现代前端开发的世界中,Vue 3 已然成为了一个备受喜爱的框架,而 Vite 作为一个新兴的构建工具,以其极高的效率和简捷的配置方式席卷了开发者圈,本文我们将一步一步展示如何使用 Vite 构建一个 Vue 3 项目,从创建项目到最后的构建阶段,需要的朋友可以参考下
    2024-07-07
  • Vue项目如何关闭语法检查

    Vue项目如何关闭语法检查

    这篇文章主要介绍了Vue项目如何关闭语法检查问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • element ui富文本编辑器的使用效果与步骤(quill-editor)

    element ui富文本编辑器的使用效果与步骤(quill-editor)

    富文本编辑器在任何项目中都会用到,在Element中我们推荐vue-quill-editor组件,下面这篇文章主要给大家介绍了关于element ui富文本编辑器的使用效果与步骤(quill-editor)的相关资料,需要的朋友可以参考下
    2022-10-10
  • Vue的transition-group与Virtual Dom Diff算法的使用

    Vue的transition-group与Virtual Dom Diff算法的使用

    这篇文章主要介绍了Vue的transition-group与Virtual Dom Diff算法的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Vue3实现clipboard复制的使用示例

    Vue3实现clipboard复制的使用示例

    在日常开发中,为用户提供复制文本功能的需求比较常见,下面介绍一款vue3可用的插件,可以快速实现这个功能,感兴趣的可以了解一下
    2023-11-11
  • 解决vue3.0运行项目warning Insert `·` prettier/prettier问题

    解决vue3.0运行项目warning Insert `·` prettier/pret

    这篇文章主要介绍了解决vue3.0运行项目warning Insert `·` prettier/prettier问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-10-10
  • 解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题

    解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题

    这篇文章主要介绍了解决vue 使用setTimeout,离开当前路由setTimeout未销毁的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-07-07
  • vue如何通过点击事件实现页面跳转详解

    vue如何通过点击事件实现页面跳转详解

    页面跳转,我们一般都通过路由跳转实现,通常情况下可直接使用router-link标签实现页面跳转,下面这篇文章主要给大家介绍了关于vue如何通过点击事件实现页面跳转的相关资料,需要的朋友可以参考下
    2022-07-07
  • vue中使用canvas绘图详解

    vue中使用canvas绘图详解

    这篇文章主要介绍了vue中使用canvas绘图方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09
  • vue 内置过滤器的使用总结(附加自定义过滤器)

    vue 内置过滤器的使用总结(附加自定义过滤器)

    这篇文章主要介绍了vue 内置过滤器的使用总结(附加自定义过滤器),详细的介绍了各种过滤器的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12

最新评论