【项目自我反思之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.rhkb.cn/news/283811.html

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

相关文章

【数据结构】猛猛干7道链表OJ

前言知识点 链表的调试技巧 int main() {struct ListNode* n1(struct ListNode*)malloc(sizeof(struct ListNode));assert(n1);struct ListNode* n2(struct ListNode*)malloc(sizeof(struct ListNode));assert(n2);struct ListNode* n3(struct ListNode*)malloc(sizeof(struc…

如何从零开始拆解uni-app开发的vue项目(一)

uni-app项目分析: 背景:最近接手一个前同事留下的半拉子项目,出拿过来觉得很简单;当我看到app.vue的时候很确定是vue项目,心里不怎么慌,果断安装node.js,然后就去npm ;安装VS code,事实并不是我期盼的那样,或者说根本就不能运行。 报错:应用vs code打开文件,输入命…

力扣每日一题 2024/3/23 统计桌面上的不同数字

题目描述 用例说明 思路讲解 给定整数n&#xff0c;找出循环十亿天后桌上的数字。可以先通过一天来找找规律。 第一天 n%i1 &#xff08;1<i<n&#xff09;只有n-1符合.加入桌面 第二天(n-1)%i1 &#xff08;1<i<n-1&#xff09;只有n-2符合 加入桌面 依次类推…

低代码开发平台开源:依靠科技力量实现数字化转型!

在竞争激烈的当今社会&#xff0c;数字化转型、流程化办公等字眼早已充斥在我们的职场生活中。虽然如此&#xff0c;但是我们依然要面临着这样一个现实问题&#xff1a;很多中小企业发展面临着资源有限、技术储备不足、人才短缺的现实问题&#xff0c;进入流程化办公困境依然明…

记录C++中,子类同名属性并不能完全覆盖父类属性的问题

问题代码&#xff1a; 首先看一段代码&#xff1a;很简单&#xff0c;就是BBB继承自AAA&#xff0c;然后BBB重写定义了同名属性&#xff0c;然后调用父类AAA的打印函数&#xff1a; #include <iostream> using namespace std;class AAA { public:AAA() {}~AAA() {}void …

145 Linux 网络编程1 ,协议,C/S B/S ,OSI 7层模型,TCP/IP 4层模型,

一 协议的概念 从应用的角度出发&#xff0c;协议可理解为“规则”&#xff0c;是数据传输和数据的解释的规则。 典型协议 传输层 常见协议有TCP/UDP协议。 应用层 常见的协议有HTTP协议&#xff0c;FTP协议。 网络层 常见协议有IP协议、ICMP协议、IGMP协议。 网络接口层 常…

NLP 笔记:LDA(训练篇)

1 前言&#xff1a;吉布斯采样 吉布斯采样的基本思想是&#xff0c;通过迭代的方式&#xff0c;逐个维度地更新所有变量的状态 1.1 举例 收拾东西 假设我们现在有一个很乱的屋子&#xff0c;我们不知道东西应该放在哪里&#xff08;绝对位置&#xff09;&#xff0c;但知道哪…

【排序算法】实现快速排序值(霍尔法三指针法挖坑法优化随即选key中位数法小区间法非递归版本)

文章目录 &#x1f4dd;快速排序&#x1f320;霍尔法&#x1f309;三指针法&#x1f320;挖坑法✏️优化快速排序 &#x1f320;随机选key&#x1f309;三位数取中 &#x1f320;小区间选择走插入&#xff0c;可以减少90%左右的递归&#x1f309; 快速排序改非递归版本&#x1…

设计模式及其在项目、框架中的应用

设计模式的作用&#xff1a; 1、类之间关系图&#xff0c;明确的角色及其关系、作用&#xff1b; 2、符合开闭原则&#xff0c;职责明确&#xff0c;并且开放的拓展点可以有效应对后期的变化。 &#xff08;一&#xff09;、责任链模式 适用场景&#xff1a; 在一个流程中&…

【QT入门】 Qt实现自定义信号

往期回顾&#xff1a; 【QT入门】图片查看软件(优化)-CSDN博客 【QT入门】 lambda表达式(函数)详解-CSDN博客 【QT入门】 Qt槽函数五种常用写法介绍-CSDN博客 【QT入门】 Qt实现自定义信号 一、为什么需要自定义信号 比如说现在一个小需求&#xff0c;我们想要实现跨ui通信&a…

Git 使用笔记

基本操作&#xff1a; 初始化 &#xff08;git init&#xff09; 使用背景和作用&#xff1a; 在本地建立一个文件夹后&#xff0c;基于这个文件夹进行git 操作&#xff0c;赋予git操作本文件夹的权限 。查看当前文件夹状态&#xff08;git status&#xff09; 每次打开文件夹…

环信新版单群聊UIKit集成指南——Android篇

前言 环信新版UIKit已重磅发布&#xff01;目前包含单群聊UIKit、聊天室ChatroomUIKit&#xff0c;本文详细讲解Android端单群聊UIKit的集成教程。 环信单群聊 UIKit 是基于环信即时通讯云 IM SDK 开发的一款即时通讯 UI 组件库&#xff0c;提供各种组件实现会话列表、聊天界…

机器学习:智能时代的核心引擎

目录 一、什么是机器学习 二、监督学习 三、无监督学习 四、半监督学习 五、强化学习 一、什么是机器学习 机器学习是人工智能的一个分支&#xff0c;它主要基于计算机科学&#xff0c;旨在使计算机系统能够自动地从经验和数据中进行学习并改进&#xff0c;而无需进行明确…

鸿蒙Harmony应用开发—ArkTS(stateStyles:多态样式)

Styles和Extend仅仅应用于静态页面的样式复用&#xff0c;stateStyles可以依据组件的内部状态的不同&#xff0c;快速设置不同样式。这就是我们本章要介绍的内容stateStyles&#xff08;又称为&#xff1a;多态样式&#xff09;。 概述 stateStyles是属性方法&#xff0c;可以…

CodeSys创建自定义的html5控件

文章目录 背景创建html5control.xml文件控件界面以及逻辑的实现使用的资源安装自定义的html5控件库 背景 查看官方的资料&#xff1a;https://content.helpme-codesys.com/en/CODESYS%20Visualization/_visu_html5_dev.html 官方的例子&#xff1a;https://forge.codesys.com/…

【机器学习入门 】逻辑斯蒂回归和分类

系列文章目录 第1章 专家系统 第2章 决策树 第3章 神经元和感知机 识别手写数字——感知机 第4章 线性回归 文章目录 系列文章目录前言一、分类问题的数学形式二、最大似然估计三、交叉熵损失函数四、多类别分类多类别逻辑斯蒂回归归一化指数函数交叉熵误差和均方误差的比较 五…

MySQL、Oracle的时间类型字段自动更新:insert插入、update更新时,自动更新时间戳。设置自增主键id,oracle创建自增id序列和触发器

1. MySQL 支持设置自增id的字段类型&#xff1a;int、bigint、double等数值类型&#xff0c;一般用int、bigint支持设置自动更新时间的字段类型&#xff1a;datetime、timestamp下面sql中的now()函数可以用current_timestamp()替代 1.1. 不指定秒精度 drop table if exists …

【蓝桥杯-单片机】基于定时器的倒计时程序设计

基于定时器的倒计时程序 题目如下所示&#xff1a; 实现过程中遇到的一些问题 01 如何改变Seg_Buf数组的值数码管总是一致地显示0 1 2 3 4 5 首先这个问题不是在main.c中关于数码管显示部分的逻辑错误&#xff0c;就是发生在数码管的底层错误。 检查了逻辑部分&#xff…

【C++庖丁解牛】二叉搜索树(Binary Search Tree,BST)

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 二叉搜索树概念2. 二叉…

python框架的一加剧场管理系统的设计与实现flask-django-nodejs-php

本文讲述了一加剧场管理系统。结合电子管理系统的特点&#xff0c;分析了一加剧场管理系统的背景&#xff0c;给出了一加剧场管理系统实现的设计方案。 本论文主要完成不同用户的权限划分&#xff0c;不同用户具有不同权限的操作功能&#xff0c;在用户模块&#xff0c;主要有用…