当前位置: 首页 > 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 值

相关文章:

  • 企业私有化部署的平价革命:五步实现“低成本高可控”AI落地——破除百万投入迷思,中小企业也能玩转私有化大模型
  • 李沐《动手学深度学习》d2l安装教程
  • 在 Windows 系统上运行 Docker 容器中的 Ubuntu 镜像并显示 GUI
  • window查看SVN账号密码
  • 第四十六天打卡
  • 华为 “一底双长焦” 专利公布,引领移动影像新变革
  • vue中加载Cesium地图(天地图、高德地图)
  • 解决基于LangGraph框架的DeerFlow使用Qwen3不能正常被解析的问题
  • SOC-ESP32S3部分:31-ESP-LCD控制器库
  • TeamCity Agent 配置完整教程(配合 Docker Compose 快速部署)
  • Vite 双引擎架构 —— Esbuild 概念篇
  • Self Attention自注意力机制
  • 使用 Docker Compose 从零部署 TeamCity + PostgreSQL(详细新手教程)
  • Ubuntu 系统通过防火墙管控 Docker 容器
  • 【PyQt5】用于设置控件位置的参数
  • 【Kotlin】注解反射扩展
  • [大A量化专栏] 夏普比率
  • Linux 下的COW机制(copy-on-write)
  • android app 一个 crash的解决过程!
  • 26.【新型数据架构】-零ETL架构
  • 青州网站建设/成全视频免费观看在线看
  • 城乡与住房建设厅网站/网络推广方式方法
  • 做英文网站哪个网站比较好/seo网站优化公司
  • 科技企业网站/微信推广朋友圈广告
  • 南阳专业做网站公司/seo相关岗位
  • wordpress主页设置错误/谷歌排名优化入门教程