news 2026/6/9 23:14:17

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/6/9 22:27:21

Dockerfile中使用Miniconda作为基础镜像的优势

Dockerfile中使用Miniconda作为基础镜像的优势 在AI模型训练和数据科学项目日益复杂的今天&#xff0c;一个常见的困扰是&#xff1a;为什么同样的代码&#xff0c;在同事的机器上运行正常&#xff0c;到了你的环境却报错不断&#xff1f;更糟的是&#xff0c;几个月后你自己想…

作者头像 李华
网站建设 2026/6/9 22:41:17

て 的用法

一、一句话先给你“核心答案” &#x1f449; 当一个动作「不是句子的最终结束」&#xff0c;而是“为后面的动作服务”时&#xff0c;就用「て形」。二、从中文思维入手&#xff08;最重要&#xff09; 先看中文怎么说。 中文里出现这些词时&#xff0c;日语几乎一定用「て形」…

作者头像 李华
网站建设 2026/6/9 22:27:46

Miniconda-Python3.9安装HuggingFace Transformers全流程

Miniconda-Python3.9 安装 HuggingFace Transformers 全流程优化版 在当今AI研发日益工程化的背景下&#xff0c;一个稳定、可复现且高效隔离的开发环境&#xff0c;往往比模型本身更能决定项目的成败。尤其是在自然语言处理领域&#xff0c;当你试图微调一个BERT变体或部署T5进…

作者头像 李华
网站建设 2026/6/6 16:53:12

Docker run启动Miniconda-Python3.9镜像并运行PyTorch脚本示例

Docker运行Miniconda-Python3.9并执行PyTorch脚本实践指南 在现代AI开发中&#xff0c;一个常见的痛点是&#xff1a;“代码在我机器上能跑&#xff0c;但在别人环境里却报错。” 这背后往往是Python版本不一致、依赖库冲突或CUDA驱动差异导致的“环境地狱”。尤其当团队协作、…

作者头像 李华
网站建设 2026/6/8 8:42:12

利用Miniconda-Python3.9镜像快速构建可复现的AI开发环境

利用Miniconda-Python3.9镜像快速构建可复现的AI开发环境 在人工智能项目日益复杂的今天&#xff0c;一个常见的场景是&#xff1a;研究员兴奋地分享他的实验成果&#xff0c;“模型准确率提升了3%&#xff01;”——但当同事尝试复现时&#xff0c;却卡在了环境依赖上。“torc…

作者头像 李华
网站建设 2026/6/8 16:52:57

清华源配置pip和conda双通道加速安装技巧

清华源配置pip和conda双通道加速安装技巧 在人工智能、数据科学和工程开发中&#xff0c;Python 已成为事实上的标准语言。无论是搭建深度学习模型、处理海量数据&#xff0c;还是构建自动化脚本&#xff0c;开发者几乎都绕不开庞大的第三方库生态。然而&#xff0c;在国内使用…

作者头像 李华