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

vue3子组件获取并修改父组件的值

在子组件中,父组件传递来的 prop 是只读的,但是确实有修改的需求,故此做个小小研究

// 父组件使用模版:@update:xxx="dialogVisible = $event"
// 子组件使用模版
// const emits = defineEmits(['update:xxx']);
// emits('update:xxx',false)// 父组件
// :dialogVisible="dialogVisible"  向子组件传值(查询用)
// @update:dialogVisible="dialogVisible = $event" 向子组件传值(可修改)
<HelloWorld:dialogVisible="dialogVisible" @update:dialogVisible="dialogVisible = $event"
></HelloWorld>const dialogVisible = ref(false)// 子组件
// 接收父组件的数据和方法
const parentData = defineProps(['dialogVisible']);
// 接收父组件需要修改的值
const emits = defineEmits(['update:dialogVisible']);const onReset = ()=>{// 子组件执行修改父组件值emits('update:dialogVisible',false)console.log('emits','修改成功');console.log('parentData.dialogVisible 1',parentData.dialogVisible); // truenextTick(()=>{console.log('parentData.dialogVisible 2',parentData.dialogVisible); // false})setTimeout(()=>{console.log('parentData.dialogVisible 2',parentData.dialogVisible); // false},0)
}

小现象

在子组件修改 dialogVisible 值后立即从父组件再获取并打印时发现值并未立即修改

为什么会打印旧值?

  1. emit 是同步的:事件触发是同步操作

  2. 状态更新是同步的:在父组件的事件处理函数中,状态赋值是同步的

  3. prop 传递是异步的:Vue 的响应式系统更新和重新渲染是异步的

  4. 组件更新顺序

    • 子组件触发 emit

    • 父组件同步更新自己的状态

    • 父组件状态更新后,需要重新渲染才能将新值传递给子组件

    • 在子组件的 emit 方法后立即打印,此时父组件尚未完成重新渲染

执行流程详解

  1. 子组件调用 emits('update:dialogVisible', false)

  2. 父组件的 @update:dialogVisible 处理函数执行

  3. 父组件同步更新 dialogVisible = false

  4. 此时在父组件处理函数中打印 dialogVisible 会显示 false

  5. 但在子组件中,props.dialogVisible 不会立即更新

  6. Vue 开始异步更新过程(下一个 tick)

  7. 父组件重新渲染,将新值传递给子组件

  8. 子组件接收到新的 prop 值

http://www.lryc.cn/news/2403209.html

相关文章:

  • 【Redis】Cluster集群
  • 黑马Java面试笔记之 微服务篇(SpringCloud)
  • CLIP多模态大模型的优势及其在边缘计算中的应用
  • 基于STM32语音识别柔光台灯
  • 基于PSO粒子群优化的VMD-GRU时间序列预测算法matlab仿真
  • 探索未知惊喜,盲盒抽卡机小程序系统开发新启航
  • 基于开源AI大模型与AI智能名片的S2B2C商城小程序源码优化:企业成本管理与获客留存的新范式
  • Python----目标检测(YOLO简介)
  • mysql+keepalived
  • Profinet 协议 IO-Link 主站网关(三格电子)
  • Ubuntu22.04 安装 Miniconda3
  • Hubstudio浏览器如何使用Loongproxy?
  • 硬件工程师笔记——555定时器应用Multisim电路仿真实验汇总
  • ComfyUI 对图片进行放大的不同方法
  • Elasticsearch最新入门教程
  • 第16节 Node.js 文件系统
  • 【Linux网络篇】:从HTTP到HTTPS协议---加密原理升级与安全机制的全面解析
  • jenkins结合gitlab实现CI
  • SQL进阶之旅 Day 17:大数据量查询优化策略
  • 字符串 金额转换
  • 浅聊一下,大模型应用架构 | 工程研发的算法修养系列(二)
  • 装载机防撞系统:智能守护,筑牢作业现场人员安全防线
  • 上门服务小程序订单系统框架设计
  • 11.MySQL事务管理详解
  • 前端实现视频/直播预览
  • React源码阅读-fiber核心构建原理
  • 视频监控管理平台EasyCVR与V4分析网关对接后告警照片的清理优化方案
  • 基于 BGE 模型与 Flask 的智能问答系统开发实践
  • 机器学习:决策树和剪枝
  • vscode自定义主题语法及流程