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

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.lqws.cn/news/188821.html

相关文章:

  • 【计算机网络】非阻塞IO——poll实现多路转接
  • 【佳易王个体诊所电子处方软件】助力智慧诊疗! #医疗数字化 #电子处方效率提升
  • 【 知你所想 】基于ernie-x1-turbo推理模型实现趣味猜心游戏
  • QT自定义资源管理器
  • 使用UDP连接ssh
  • maven私服
  • vanna+deepseek+chainlit 实现自然语言转SQL的精度调优
  • Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
  • MySQL 性能调优入门 - 慢查询分析与索引优化基础
  • 行业案例 | ASOS 借助 Azure AI Foundry(国际版)为年轻时尚爱好者打造惊喜体验
  • [electron]预脚本不显示内联script
  • AIGC 基础篇 Python基础 01
  • [特殊字符]解决 “IDEA 登录失败。不支持早于 14.0 的 GitLab 版本” 问题的几种方法
  • Halcon透视矩阵
  • 深入了解JavaScript当中如何确定值的类型
  • 经典文献阅读之--PIVOT-R(原始驱动的航点感知世界模型用于机器人操作)
  • 蓝桥春晚魔术(欧拉定理+快速幂)
  • 今日行情明日机会——20250606
  • 车牌识别技术解决方案
  • 大模型在脑梗塞后遗症风险预测及治疗方案制定中的应用研究
  • 使用VTK还是OpenGL集成到qt程序里哪个好?
  • 电脑桌面太单调,用Python写一个桌面小宠物应用。
  • 计算机视觉与深度学习 | 基于MATLAB的相机标定
  • 【 *p取出内容 a得到地址】
  • 服务器健康摩尔斯电码:深度解读S0-S5状态指示灯
  • 循环神经网络(RNN)
  • 增量式网络爬虫通用模板
  • Numpy5——数组的扩充(相加、复制、广播)排序,形状调整
  • RabbitMQ 学习
  • android debug包和release包的区别