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/22 4:09:06

Markdown数学公式渲染:Jupyter+Miniconda完美支持

Jupyter Miniconda&#xff1a;构建可复现的数学公式渲染环境 在数据科学与人工智能研究中&#xff0c;一个常见的挑战是&#xff1a;如何让代码、文档和数学推导真正融为一体&#xff1f;我们不仅要跑通模型&#xff0c;还要清晰地展示背后的理论依据——比如贝叶斯推断中的后…

作者头像 李华
网站建设 2026/4/16 10:08:46

耐达讯自动化PROFIBUS三路中继器:突破工业通信距离与干扰限制的利器

在工业自动化领域&#xff0c;高效稳定的通信是保障生产流程顺畅运行的关键。Profibus DP作为一种广泛应用的现场总线标准&#xff0c;在工业设备的连接与数据交互中发挥着重要作用。然而&#xff0c;随着工业生产规模的不断扩大和生产环境的日益复杂&#xff0c;对Profibus DP…

作者头像 李华
网站建设 2026/4/23 6:05:23

Pyenv安装多个Python版本供Miniconda环境调用

Pyenv 与 Miniconda 协同构建多版本 Python 开发环境 在现代 AI 工程实践和科研开发中&#xff0c;一个常见的痛点是&#xff1a;不同项目对 Python 版本有着截然不同的要求。比如&#xff0c;某个老项目依赖的 TensorFlow 2.12 最高只支持到 Python 3.9&#xff0c;而新的 Lan…

作者头像 李华
网站建设 2026/4/21 3:44:46

15款强兼容2026年项目管理软件排行最新

在数字化转型纵深推进的今天&#xff0c;项目管理的复杂度与协同广度持续提升&#xff0c;远程办公、跨部门协作、多系统联动已成为常态。具备强兼容性且能精准管控全流程的项目管理软件&#xff0c;成为企业提升交付效率、降低协作成本的核心基础设施。本文筛选出2026年最新15…

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

HTML表单提交数据至Miniconda后台Python接口

HTML表单提交数据至Miniconda后台Python接口 在科研计算、AI实验和工程测试中&#xff0c;越来越多的团队希望让非程序员也能轻松参与数据处理流程。一个常见的需求是&#xff1a;用户通过网页填写几个参数&#xff0c;点击“提交”&#xff0c;系统便自动调用后端模型完成复杂…

作者头像 李华
网站建设 2026/4/16 10:08:52

CUDA安装与nvidia-docker运行时的关系说明

CUDA与nvidia-docker运行时的协同机制解析 在现代AI研发中&#xff0c;我们常常听到这样的问题&#xff1a;“我已经在容器里装了PyTorch&#xff0c;为什么CUDA还是不可用&#xff1f;”或者“我明明安装了CUDA Toolkit&#xff0c;为什么nvidia-smi在容器里看不到GPU&#xf…

作者头像 李华