当前位置: 首页 > news >正文

子传父的核心应用场景(vue3) - 教程

子传父的核心应用场景(vue3) - 教程

我们常见的组件通信的方式是prop和emit,下面我们来探讨一下什么场景下使用子传父。

子传父的核心场景是:子组件产生了“需要父组件响应”的事件或数据,但子组件自身无法(或不应该)处理,必须交给父组件决策/存储/分发

父传子是“数据下行”(父给子展示用),子传父是“事件/数据上行”(子告诉父“我发生了什么”,让父处理)。以下是最常见的场景,带具体例子和简单实现思路:

一、最核心场景:子组件的用户交互,需要父组件处理逻辑

子组件是“交互载体”(比如按钮、输入框、表单),用户操作子组件后,子组件本身不知道要做什么业务逻辑,必须通知父组件执行。

1. 按钮/开关的“触发事件”
<!-- 子组件 MyButton.vue --><template><button @click="handleClick"> {{ btnText }} </button></template><script setup>import { defineProps, defineEmits } from 'vue';const props = defineProps({btnText: {type: String,required: true}});const emit = defineEmits(['click']);const handleClick = () => {emit('click');};</script><!-- 父组件 Parent.vue --><template><MyButton btnText="提交" @click="submitForm" /></template><script setup>import MyButton from './MyButton.vue';const submitForm = () => {// 调用API提交数据、跳转页面等操作};</script>
2. 输入框/选择器的“数据回传”
  • 场景:子组件是一个自定义输入框(比如“搜索输入框”“日期选择器”),用户输入/选择后,子组件需要把输入的值传给父组件,父组件可能用这个值做搜索、筛选、存储等。
  • 例子
    • 子组件(MyInput):负责输入框渲染,输入时把值传给父组件。
    • 父组件:接收输入值,执行“搜索数据”的逻辑。
  • 简单代码
<!-- 子组件 MyInput.vue --><template><inputtype="text":value="modelValue"@input="handleInput"placeholder="请输入搜索关键词"/></template><script setup>import { defineProps, defineEmits } from 'vue';const props = defineProps({modelValue: {type: String,default: ''}});const emit = defineEmits(['update:modelValue']);const handleInput = (e) => {const inputValue = e.target.value;emit('update:modelValue', inputValue);};</script><!-- 父组件 Parent.vue --><template><MyInput v-model="searchKey" /><button @click="searchData">搜索</button><p>搜索关键词: {{ searchKey }}</p></template><script setup>import { ref } from 'vue';import MyInput from './MyInput.vue';const searchKey = ref('');const searchData = () => {// 调用API搜索数据...};</script>
3. 表单提交的“数据汇总”
  • 场景:子组件是一个完整表单(比如“用户注册表单”“商品编辑表单”),用户填写完成后点击提交,子组件收集所有表单字段的值,传给父组件,父组件处理API提交、数据校验等。
  • 例子
    • 子组件(UserForm):收集姓名、年龄等字段,提交时把表单数据传给父。
    • 父组件:接收表单数据,执行“注册用户”的API请求。

二、子组件状态变化,需要父组件同步

子组件自身管理了一些状态(比如折叠/展开、选中状态),但父组件需要知道这个状态(比如父组件的标题要根据子组件的折叠状态变化,或父组件要根据子组件的选中状态更新其他UI)。

1. 折叠面板/抽屉的“状态同步”
<!-- 子组件 CollapsePanel.vue --><template><div class="panel"><div class="header" @click="toggleCollapse">{{ title }}<span>{{ isCollapsed ? '展开' : '收起' }}</span></div><div class="content" v-show="!isCollapsed">面板内容...</div></div></template><script setup>import { ref, defineProps, defineEmits } from 'vue';const props = defineProps({title: {type: String,required: true},collapsed: {type: Boolean,required: true}});const emit = defineEmits(['update:collapsed']);const isCollapsed = ref(props.collapsed);// 监听 props 变化,同步到内部状态watch(() => props.collapsed, (newVal) => {isCollapsed.value = newVal;});const toggleCollapse = () => {isCollapsed.value = !isCollapsed.value;emit('update:collapsed', isCollapsed.value);};</script><!-- 父组件 Parent.vue --><template><CollapsePanel title="筛选条件" v-model:collapsed="isPanelCollapsed" /><button v-show="!isPanelCollapsed" @click="resetFilter">重置筛选</button></template><script setup>import { ref } from 'vue';import CollapsePanel from './CollapsePanel.vue';const isPanelCollapsed = ref(true);const resetFilter = () => {console.log('父组件:重置筛选条件');};</script>
2. 选项卡/分页的“切换事件”
  • 场景:子组件是一个分页组件(比如“商品列表分页”),用户点击“下一页”时,子组件需要把“当前页码”传给父组件,父组件根据页码请求对应页的数据。
  • 例子
    • 子组件(Pagination):管理页码、每页条数,页码变化时通知父。
    • 父组件:接收页码,请求对应页的商品数据。

三、子组件需要“反向控制”父组件的UI/数据

子组件的某个操作,需要父组件改变自身的状态(比如父组件的弹窗显示/隐藏、父组件的数据源更新)。

1. 弹窗的“关闭事件”
<!-- 子组件 MyModal.vue --><template><div class="modal" v-if="modelValue"><div class="modal-content"><h3>弹窗标题</h3><p>弹窗内容...</p><button @click="handleClose">关闭</button></div></div></template><script setup>import { defineProps, defineEmits } from 'vue';const props = defineProps({modelValue: {type: Boolean,required: true}});const emit = defineEmits(['update:modelValue', 'close']);const handleClose = () => {emit('update:modelValue', false);emit('close');};</script><!-- 父组件 Parent.vue --><template><button @click="showModal = true">打开弹窗</button><!--使用 v-model 绑定弹窗的显示状态。同时监听 'close' 事件,执行额外的回调。--><MyModal v-model="showModal" @close="onModalClose" /></template><script setup>import { ref } from 'vue';import MyModal from './MyModal.vue';const showModal = ref(false);// 弹窗关闭时的回调const onModalClose = () => {};</script>
2. 子组件触发父组件的数据源更新
  • 场景:子组件是一个“新增用户”组件,用户填写完信息提交后,子组件把新增的用户数据传给父组件,父组件把这个数据添加到自己的“用户列表”数据源中,实现列表实时更新。

总结:子传父的核心逻辑

子组件是“执行者”(负责UI渲染和用户交互),父组件是“决策者”(负责业务逻辑、数据存储、全局状态管理)。当子组件发生了“自己处理不了”的事件或数据变化时,就需要通过$emit(Vue)、props回调(React)等方式“上报”给父组件,让父组件处理。

简单记:父传子是“给数据”,子传父是“报事件”

http://www.jsqmd.com/news/333163/

相关文章:

  • 策略模式+工厂模式实现审批流(面试问答版)
  • 告别学术入门恐慌:paperzz 开题报告搭建硕士科研的智能脚手架
  • 网络安全/黑客入门教程【详细版】从零基础入门到精通,看完这一篇就够了
  • 学术突围利器 | paperzz 开题报告 | 硕士研究生的开题救星
  • 闲置支付宝红包套装别浪费,这几种处理方式,实用又不亏 - 团团收购物卡回收
  • 运维 / 测试转网安,2026年最顺的规划:用老经验走新赛道
  • 14. 字符串
  • 2026年 精铸腊厂家推荐排行榜:精铸腊,精密铸造腊,低温/中温/模具/工业/航空发动机精铸腊,专业品质与创新技术深度解析 - 品牌企业推荐师(官方)
  • 网络安全学习路线,入门到入坟,史上最全网络安全学习路线整理
  • 100N06NF-ASEMI“60V功率控制的效率密码”
  • 25. 图集
  • Day27事件对象及常见属性
  • 学霸同款10个降AI率平台 千笔帮你高效降AIGC
  • 基于自适应动态规划(ADHDP)的仿真程序实现
  • 快速讲讲多线程线程池
  • 讲讲蜡烛香精厂商选购要点,价格多少钱合适 - 工业推荐榜
  • 数控加工高精尖硬活,全靠国产数控编程撑底气
  • 研究生收藏!千笔ai写作,最受喜爱的AI论文平台
  • 液冷数据中心建设公司选购指南,参考排名选口碑好的 - mypinpai
  • 2026年浇注料/可塑料/磷酸盐砖生产厂家推荐——高温工业信赖之选 - 深度智识库
  • 深度测评!研究生必备的一键生成工具 —— 千笔写作工具
  • 2026广东公考面试机构实力盘点:师资、教研与上岸率综合TOP榜 - 华Sir1
  • 2026年中国聚丙烯网状纤维厂家首选推荐:维利斯(山东)新材料科技有限公司 - 2026年企业推荐榜
  • [todo]10个常见的后端框架
  • 低成本快速启动!一站式同城跑腿小程序平台源码系统
  • 2026年2月徐州电器设备、电力设备、电气设备、油浸式变压器、干式变压器公司推荐:行业洗牌期,选对伙伴决胜未来 - 2026年企业推荐榜
  • 支付宝红包套装新手避坑指南,90%的人都踩过这些雷 - 团团收购物卡回收
  • 盘点2026年天津地区公考培训选哪家,正则教育口碑出众 - mypinpai
  • 中国大陆下载 Debian 13 安装镜像
  • 跟对老师,面试成公!2026年登科7月广东省考面试名师领航 - 华Sir1