news 2026/4/23 8:15:32

Vue:Props 和 Emits 对比总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Vue:Props 和 Emits 对比总结

Props与Emits对比摘要

核心区别:Props实现父→子单向数据流(用于配置),Emits实现子→父事件通知(用于交互)。

特性对比

  • 数据流:Props向下传递只读数据,Emits向上触发事件
  • 验证:Props支持类型/默认值验证,Emits无内置验证
  • Vue3优化:均支持TS类型推断,Composition API提供defineProps/defineEmits

使用场景

  • Props:初始化配置/展示数据
  • Emits:用户交互反馈/状态变更通知

最佳实践

  • 遵循单向数据流原则
  • 为复杂数据添加验证
  • 使用kebab-case命名事件
  • 避免直接修改Props

特殊用法:v-model本质是Props+Emits的组合语法糖。


Props 和 Emits 对比总结

对比维度Props(属性)Emits(事件)
数据流向父 → 子(单向向下)子 → 父(单向向上)
作用父组件向子组件传递数据子组件向父组件通知事件
使用场景配置子组件、传递初始数据用户交互反馈、状态变化通知
是否可变只读(子组件不应直接修改)可触发多次,传递不同数据
响应式在子组件中是响应式的事件本身不是响应式的,但可传递响应式数据

Vue 2 Options API 中的用法

特性PropsEmits
声明方式props: ['title', 'content']或对象形式emits: ['submit', 'change'](Vue 2.3+)
类型验证支持完整类型验证无内置验证(Vue 2 中)
默认值通过default属性设置不适用
必需性通过required: true设置不适用
代码示例props: {<br> title: {<br> type: String,<br> required: true<br> }<br>}emits: ['update:modelValue']

Vue 3 Composition API /<script setup>中的用法

特性PropsEmits
声明方式defineProps()defineEmits()
类型验证支持对象和泛型两种方式支持数组和对象两种方式
TypeScript完美支持类型推断完美支持类型推断
访问方式通过props.xxx访问通过emit('event', data)触发
代码示例const props = defineProps<{<br> title: string,<br> count?: number<br>}>()const emit = defineEmits<{<br> (e: 'submit', data: any): void<br>}>()

实际使用示例对比

Props 示例

<!-- 父组件 Parent.vue --> <template> <!-- 传递 props --> <ChildComponent :title="pageTitle" :count="counter" /> </template> <!-- 子组件 Child.vue --> <template> <h1>{{ title }}</h1> <p>计数: {{ count }}</p> </template> <script setup> // Vue 3 Composition API const props = defineProps({ title: String, count: { type: Number, default: 0 } }) </script>

Emits 示例

vue

<!-- 子组件 Child.vue --> <template> <button @click="handleClick">提交</button> </template> <script setup> // Vue 3 Composition API const emit = defineEmits(['submit', 'update:value']) const handleClick = () => { // 触发事件并传递数据 emit('submit', { id: 1, data: 'test' }) emit('update:value', 'new value') } </script> <!-- 父组件 Parent.vue --> <template> <!-- 监听事件 --> <ChildComponent @submit="handleSubmit" @update:value="value = $event" /> </template>

特殊用法:双向绑定

模式实现方式说明
v-modelprops: modelValue+emits: update:modelValueVue 3 默认方式
v-model:propNameprops: propName+emits: update:propNameVue 3 参数化 v-model
.sync 修饰符props: xxx+emits: update:xxxVue 2 方式(Vue 3 已废弃)

双向绑定示例

vue

<!-- 子组件 CustomInput.vue --> <script setup> const props = defineProps(['modelValue']) const emit = defineEmits(['update:modelValue']) const updateValue = (event) => { emit('update:modelValue', event.target.value) } </script> <template> <input :value="modelValue" @input="updateValue" /> </template> <!-- 父组件使用 --> <template> <!-- Vue 3 默认 v-model --> <CustomInput v-model="username" /> <!-- Vue 3 参数化 v-model --> <CustomInput v-model:firstName="first" v-model:lastName="last" /> </template>

最佳实践对比

最佳实践PropsEmits
命名规范使用 camelCase 声明,kebab-case 传递使用 kebab-case 命名事件
数据验证始终添加类型验证和默认值为复杂数据添加验证函数
单向数据流不要直接修改 props,使用 emits 通知父组件修改传递最小必要数据,避免传递整个对象
TypeScript使用泛型语法获得更好的类型安全为事件定义完整类型签名
文档注释为每个 prop 添加 JSDoc 注释说明用途为每个事件添加注释说明触发时机

常见错误对比

错误类型Props 相关错误Emits 相关错误
语法错误使用 v-bind 传递动态值::prop="value"监听事件使用 @ 或 v-on:@event="handler"
逻辑错误在子组件中修改 props(违反单向数据流)在父组件中直接修改子组件数据(应通过事件)
性能问题传递大型对象导致不必要的重新渲染频繁触发高开销的事件处理函数
类型错误传递错误类型的数据(类型验证可捕获)事件参数类型与处理函数期望类型不匹配

选择指南

场景应该使用 Props应该使用 Emits
配置子组件✅ 传递初始配置、样式参数
用户交互反馈✅ 按钮点击、表单提交
数据展示✅ 传递要显示的数据
状态变化通知✅ 数据更新、组件状态变化
表单输入✅ 接收初始值✅ 输入变化时通知父组件

核心原则:Props 向下,Events 向上。


父组件通过 Props 控制子组件的显示,子组件通过 Emits 通知父组件用户交互。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/14 10:05:55

Docker + Miniconda-Python3.9 可移植AI开发环境

Docker Miniconda-Python3.9 可移植AI开发环境 在人工智能项目日益复杂的今天&#xff0c;一个常见的场景是&#xff1a;团队成员兴奋地分享自己的实验成果&#xff0c;代码跑通、模型准确率惊人——可当别人拉下代码尝试复现时&#xff0c;却卡在了“ModuleNotFoundError”或…

作者头像 李华
网站建设 2026/4/21 16:42:43

想知道武昌天玑AIGEO优化系统哪家好?答案在这!

想知道武昌天玑AIGEO优化系统哪家好&#xff1f;答案在这&#xff01;在当今科技飞速发展的时代&#xff0c;天玑AIGEO优化系统在众多行业中发挥着越来越重要的作用。然而&#xff0c;该领域的技术发展并非一帆风顺&#xff0c;存在着诸多挑战。行业痛点分析当前&#xff0c;天…

作者头像 李华
网站建设 2026/4/22 15:15:41

Markdown生成静态网站:使用MkDocs+Miniconda

使用 MkDocs Miniconda 构建可复现的静态文档系统 在科研团队、AI工程组或开源项目中&#xff0c;你是否遇到过这样的场景&#xff1a;同事提交了一篇技术文档&#xff0c;本地预览正常&#xff0c;但 CI 构建失败&#xff1f;或者几个月后想复现某个实验报告时&#xff0c;发…

作者头像 李华
网站建设 2026/4/21 23:16:48

Markdown笔记嵌入代码输出:Miniconda+Jupyter完美组合

Miniconda Jupyter&#xff1a;现代 AI 开发的黄金搭档 在数据科学和人工智能项目日益复杂的今天&#xff0c;开发者面临的挑战早已不止是算法本身。如何快速搭建稳定、可复现的开发环境&#xff1f;怎样让实验过程清晰可追溯&#xff1f;团队协作中又该如何避免“在我机器上…

作者头像 李华
网站建设 2026/3/25 5:10:10

Linux服务器上部署Miniconda-Python3.9用于批量AI任务处理

Linux服务器上部署Miniconda-Python3.9用于批量AI任务处理 在人工智能项目日益复杂、模型迭代速度不断加快的今天&#xff0c;一个稳定、可复现且易于维护的运行环境&#xff0c;往往比算法本身更能决定项目的成败。尤其是在多用户共享的Linux服务器环境中&#xff0c;面对不同…

作者头像 李华
网站建设 2026/4/19 3:34:11

Miniconda-Python3.9初始化失败?检查bashrc/zshrc配置

Miniconda-Python3.9 初始化失败&#xff1f;检查 bashrc/zshrc 配置 在搭建 AI 开发环境时&#xff0c;你是否遇到过这样的场景&#xff1a;刚装完 Miniconda&#xff0c;满怀期待地输入 conda --version&#xff0c;结果终端却冷冷地回你一句&#xff1a; conda: command not…

作者头像 李华