【项目自我反思之vue的组件通信】

为什么子组件不能通过props实时接收父组件修改后动态变化的值

  • 一、现象
  • 二、可能的原因
    • 1.响应式系统的限制
    • 2.异步更新队列
    • 3.父组件和子组件的生命周期
    • 4.子组件内部对 props 的处理
  • 三、组件通信的几种场景(解决方案)
    • 1.子组件想修改父组件的数据
    • 2.子组件传给父组件的值是动态变化的
    • 3.父组件引用子组件

一、现象

在 Vue 中,props 是用来接收父组件传递给子组件的数据的。然而,有时你可能会发现子组件的 props 并没有实时地反映父组件中对应数据的改变。

二、可能的原因

1.响应式系统的限制

Vue 的响应式系统依赖于 JavaScript 的 getter 和 setter。当父组件中的数据发生改变时,如果这个改变是 Vue 的响应式系统可以监测到的(例如,通过赋值操作直接修改对象的属性),那么子组件中的 props 会自动更新。但是,如果父组件中的数据改变是通过某些方式绕过了 Vue 的响应式系统(例如,通过数组索引直接修改数组元素或替换数组/对象引用),那么子组件的 props 可能不会更新。

2.异步更新队列

Vue 为了优化性能,使用了异步更新队列。这意味着当你修改数据后,视图不会立即更新,而是等到下一个“tick”时才更新。这通常不是问题,因为大多数情况下你不需要立即看到更新后的视图。但是,如果你在数据改变后立即尝试读取子组件的 props,可能会得到旧的值,因为视图还没有更新。

3.父组件和子组件的生命周期

确保在父组件中传递 props 的时候,子组件已经被创建和挂载。如果在子组件还没有挂载之前就改变了父组件中的数据,那么子组件的 props 可能不会正确更新。
在这里插入图片描述

4.子组件内部对 props 的处理

如果你在子组件内部对 props 进行了修改或计算,那么可能会产生不可预期的结果。Vue 不推荐直接修改 props,而应该使用 data 或 computed 属性来处理 props 的值。

三、组件通信的几种场景(解决方案)

1.子组件想修改父组件的数据

第一种是我们常用的:子组件通过props接收,并用emit通知父组件修改信息
父组件:

<template><view>我是父组件</view><Child :msg="msg" @msg="getMsg"></Child>
</template>
<script>import Child from './Child'components:{Child},data(){return{msg:"我是要传给子组件的信息"}},methods:{getMsg(msg){this.msg=msg;}}
</script>

子组件接收到信息好,想修改父组件的信息怎么办?单向数据流:传递要修改的值,然后通知父组件去修改
子组件:

<template><view>我是子组件</view>{{msg}}<button @click="pushMsg">更新msg</button>
</template>
<script>props:["msg"],data(){return{newMsg:"我是子组件传递的信息"}},methods:{pushMsg(e){this.$emit("msg",this.newMsg);}}
</script>

2.子组件传给父组件的值是动态变化的

可以用watch进行监听,监听到后发送给父组件:

<template><view>我是子组件</view>{{msg}}
</template>
<script>props:["msg"],data(){return{msg:"我是子组件传递的信息"}},watch{'msg':function(newValue,oldValue){this.$emit("msg",newValue);}}</script>

以上两种情况都是子数据想要修改、获取父组件数据的情况,下面一种情况是父组件想要获取子组件的数据

3.父组件引用子组件

ref 是用来在 Vue 组件中给子组件或 DOM 元素添加一个标识符,以便在父组件中可以直接引用这些子组件或 DOM 元素。通过 ref 可以方便地在父组件中访问子组件的属性和方法,或者操作 DOM 元素,而无需通过事件或 props 进行通信。

注:$refs 只有在组件渲染完成之后才能访问到真正的 DOM 元素或子组件实例。
父组件:

<template><div><ChildComponent ref="childRef"></ChildComponent><button @click="getChildInfo">获取子组件信息</button></div>
</template><script>
import ChildComponent from './ChildComponent.vue';export default {components: {ChildComponent},methods: {getChildInfo() {const childInstance = this.$refs.childRef;console.log(childInstance.message);childInstance.methodInChild(); // 调用子组件的方法}}
}
</script>

在上面的例子中,父组件 ParentComponent.vue 中通过 ref=“childRef” 给子组件 ChildComponent 添加了一个引用。在父组件的 getChildInfo 方法中,通过 this.$refs.childRef 就可以获取到子组件的实例,然后可以直接访问子组件的属性(如 message)或方法(如 methodInChild())。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/563065.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10开启了hyper-v,docker 启动还是报错 docker desktop windows hypervisor is not present

问题 在安装了docker windows版本后启动 docker报错docker desktop windows hypervisor is not present 解决措施 首先确认windows功能是否打开Hyper-v 勾选后重启&#xff0c;再次启动 启动后仍报这个错误&#xff0c;是Hyper-v没有设置成功 使用cmd禁用再启用 一.禁用h…

RuleApp资源社区,知识付费社区,可对接typecho的小程序APP

强大的文章/社区/自媒体客户端&#xff0c;支持打包为安卓&#xff0c;苹果&#xff0c;小程序。包括文章模块&#xff0c;用户模块&#xff0c;支付模块&#xff0c;聊天模块&#xff0c;商城模块等基础功能&#xff0c;包含VIP会员&#xff0c;付费阅读等收费体系&#xff0c…

计算机网络——26通用转发和SDN

通用转发和SDN 网络层功能&#xff1a; 转发&#xff1a; 对于从某个端口 到来的分组转发到合适的 输出端口路由&#xff1a; 决定分组从源端 到目标端的路径 网络层 传统路由器的功能 每个路由器(Per Route)的控制平面 &#xff08;传统&#xff09; 每个路由器上都有实…

创建vue3项目并集成cesium插件运行

创建vue3项目并集成cesium插件 一、vue项目创建 1、前期准备 node.js&npm或yarn 本地开发环境已经安装好。 参考安装 2、安装vue-cli&#xff0c;要求3以上版本 #先查看是否已经安装 vue -V#安装 npm install -g vue/cli4.5.17 示例&#xff1a;Idea工具 页面 Termin…

CSK6 接入聆思平台(LSPlatform)

一、开发环境 硬件&#xff1a;视觉语音大模型AI开发套件 二、使用大语言模型 官方指导文档&#xff1a; 开始使用 | 聆思文档中心 获取API密钥 | 聆思文档中心 1、注册 提交申请之后需要将注册电话号码通过微信发送给聆思科技工作人员&#xff0c;工作人员授权后&#xff…

章节10实验--Ubuntu18.04 Qt MySQL libqsqlmysql.so

前言: 内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容&#xff0c;所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。 引用: 《操作系统实践-基于Linux应用与内核编程》 作者&#xff1a;房胜、李旭健、黄…

【2024第十二届“泰迪杯”数据挖掘挑战赛】B题基于多模态特征融合的图像文本检索—解题全流程(持续更新)

2024 年(第 12 届)“泰迪杯”数据挖掘挑战赛B题 解题全流程&#xff08;持续更新&#xff09; -----基于多模态特征融合的图像文本检索 一、写在前面&#xff1a; ​ 本题的全部资料打包为“全家桶”&#xff0c; “全家桶”包含&#xff1a;数据、代码、模型、结果csv、教程…

c++的学习之路:3、入门(2)

一、引用 1、引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空 间&#xff0c;它和它引用的变量共用同一块内存空间。 怎么说呢&#xff0c;简单点理解就是你的小名&#xff0c;家里人叫你小名&#…

【MySQL】深入解析事务与MVCC

文章目录 1、事务四大特性1.1、原子性1.2、一致性1.3、隔离性1.4、持久性 2、并发事务带来问题2.1、脏读2.2、不可重复读2.3、幻读 3、事务隔离级别3.1、读未提交3.2、读已提交3.3、可重复读3.4、串行化 4、MVCC4.1、InnoDB隐藏字段4.2、undo log版本链4.3、ReadView4.4、MVCC工…

taro之Swiper的使用

图样&#xff1a; 往往我们需要轮播图去显示我们想要的图片之类的 这是工作的代码 <View classNametop-title><SwiperclassNamebanner-swiperinterval{3000}circularautoplay>{homeBannerList.map((item) > {return (<SwiperItem key{item.id}><View…

Visual Studio 2013 - 输出窗口一闪而过问题解决

Visual Studio 2013 - 输出窗口一闪而过问题解决 1. Visual Studio Console 一闪而过问题解决1.1. set Debug1.2. set Release References 1. Visual Studio Console 一闪而过问题解决 工程 -> 属性 -> 配置属性 -> 链接器 -> 系统 -> 子系统 -> 下拉框 -&g…

基于springboot+vue的宠物商城网站

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…