当前位置: 首页 > 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.xdnf.cn/news/897085.html

相关文章:

  • TTT讲师认证题目学习记录
  • C++算法训练营 Day10 栈与队列(1)
  • Java学习——正则表达式
  • PHP语言核心技术全景解析
  • 双碳时代,能源调度的难题正从“发电侧”转向“企业侧”
  • MySQL体系架构解析(二):MySQL目录与启动配置全解析
  • React从基础入门到高级实战:React 实战项目 - 项目三:实时聊天应用
  • Linux容器篇、第二章_01Ubuntu22 环境下 KubeSphere 容器平台高可用搭建全流程
  • 悲观锁和乐观锁
  • 数据库SQLite基础
  • 《完全背包》题集
  • 天机学堂(学习计划和进度)
  • TDengine 开发指南——无模式写入
  • vue-20(Vuex 状态管理的最佳实践)
  • 如何配置nginx解决前端跨域请求问题
  • Nuxt.js 中的路由配置详解
  • (转)什么是DockerCompose?它有什么作用?
  • Ubuntu 基于sdl 音频学习的基础代码
  • 市面上哪款AI开源软件做ppt最好?
  • wordpress+woocommerce电商平台搭建方案的优势分析
  • 1.3 古典概型和几何概型
  • MySQL安装与配置详细讲解
  • vue3报错:SyntaxError: Identifier ‘__vite__injectQuery‘ has already been declared
  • PostgreSQL 技术峰会,聚焦国产生态与前沿技术
  • CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
  • 【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
  • vue3:十五、管理员管理-页面搭建
  • Vue:Form正则校验
  • 数据库系统学习
  • 高效Excel合并拆分软件