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

news2024/11/18 14:29:48

为什么子组件不能通过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.coloradmin.cn/o/1540434.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Keepalive与idle监测及性能优化

Keepalive 与 idle监测 Keepalive&#xff08;保活&#xff09;: Keepalive 是一种机制&#xff0c;通常用于TCP/IP网络。它的目的是确保连接双方都知道对方仍然存在并且连接是活动的。这是通过定期发送控制消息&#xff08;称为keepalive消息&#xff09;实现的。如果在预定时…

机器学习K-means算法

K-Means 算法&#xff08;K-Means算法、K-Means 中心值计算、K-Means 距离计算公式、K-Means 算法迭代步骤、K-Means算法实例&#xff09; 问题引入 给你如下两种图片&#xff0c;快读回答2个问题&#xff0c;问 图1 中有几类五谷杂粮&#xff1f;问 图2 中有几类五谷杂粮&…

深度分析鸿蒙应用开发的准确红利期、前景、未来发展方向

近年来&#xff0c;随着互联网技术的不断发展&#xff0c;鸿蒙生态开发逐渐成为热门话题。作为一种新兴的操作系统&#xff0c;其发展趋势备受关注。同时&#xff0c;鸿蒙生态开发的价值、就业岗位需求以及相关学习方面也引起了广泛关注。 那么就目前的形势来看&#xff0c;鸿…

6-191 拓扑排序

一项工程由一组子任务构成,子任务之间有的可以并行执行,有的必须在完成了其他子任务后才能执行。例如,下图表示了一项工程若干子任务之间的先后关系。 编写函数输出所有子任务的拓扑序列。 函数接口定义: Status Push_SeqStack(SeqStack &s, ElemType x)//入栈,x入到…

镁光的sdram手册阅读--MT48LCC16M16A2

镁光的sdram手册阅读–MT48LCC16M16A2 一、这个sdram的总容量是256Mb&#xff0c;MT48LC16M16A2对应的参数是&#xff1a;4Meg 16 4banks&#xff0c;也可表示为16M16。4164256Mbit。 1&#xff09;其中&#xff0c;4Meg表示单个bank包含的存储单元个数&#xff0c;计算公式…

docker 数据卷 (二)

1&#xff0c;为什么使用数据卷 卷是在一个或多个容器内被选定的目录&#xff0c;为docker提供持久化数据或共享数据&#xff0c;是docker存储容器生成和使用的数据的首选机制。对卷的修改会直接生效&#xff0c;当提交或创建镜像时&#xff0c;卷不被包括在镜像中。 总结为两…

下载最新VMware,社区版本(免费)

VMware - Delivering a Digital Foundation For BusinessesRun any app on any cloud on any device with a digital foundation built on VMware solutions for modern apps, multi-cloud, digital workspace, security & networking.https://www.vmware.com/ 官网地址

高等数学基础篇(数二)之微分方程

微分方程&#xff1a; 一、常微分方程的基本概念 二、一阶微分方程 三、可降阶的高阶方程 四、高阶线性微分方程 目录 一、常微分方程的基本概念 二、一阶微分方程 三、可降阶的高阶方程 四、高阶线性微分方程 一、常微分方程的基本概念 二、一阶微分方程 帮助理解&…

适用于存储卡数据恢复的最佳 SD 卡恢复软件

在当今的数字时代&#xff0c;我们对 SD 卡存储关键数据的 依赖显着增加。由于其便携性和巨大的存储容量&#xff0c;这些紧凑的便携式存储设备越来越受欢迎。 选择最佳 SD 卡恢复软件时要考虑的事项&#xff1a; 兼容性&#xff1a; 选择最好的 SD 卡恢复软件时&#xff0c…

IPMI开源库pyghmi基本使用

简介&#xff1a;Pyghmi是一个纯Python&#xff08;主要是IPMI&#xff09;服务器管理库。IPMI&#xff08;Intelligent Platform Management Interface&#xff0c;智能平台管理接口&#xff09;是一种开放的标准&#xff0c;旨在帮助系统管理员在本地和远程管理服务器系统。而…

MySQL表内容的增删查改

在前面几章的内容中我们学习了数据库的增删查改&#xff0c;表的增删查改&#xff0c;这一篇我们来学习一下对表中的内容做增删查改。 CRUD : Create(创建), Retrieve(读取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;删除&#xff09; 1.创建Create 我们先创建…

C语言——字符函数

前言 字符函数是C语言中专门用来处理字符的函数&#xff0c;再C语言中&#xff0c;我们有时需要大量的处理有关字符的问题&#xff0c;所以字符函数就由此应运而生&#xff0c;接下来我来为大家简单介绍一下字符函数。 一.字符分类函数 函数如果它的参数满足下列条件就返回真…

jmeter断言使用方法

断言主流的有两种&#xff1a;响应断言、JSON断言 响应断言 1、http请求添加响应断言 2、三种作用域&#xff1a;第一种既作用主请求又作用子请求、只作用主请求、只作用子请求。我们默认选中间的仅作用主请求即可。 3、测试字段和匹配规则 测试字段一般选择响应文本即可&am…

[RootersCTF2019]I_<3_Flask -不会编程的崽

又是一个新东西哦。先看界面 源代码没提示&#xff0c;抓包没特别数据&#xff0c;没有交互界面&#xff0c;后台扫描也没文件。我知道是python模板&#xff0c;但是注入点&#xff1f;&#xff1f;&#xff1f;看来wp才知道原来还有参数爆破&#xff0c;哈哈哈。整笑了。有一…

深度学习(过拟合 欠拟合)

过拟合&#xff1a; 深度学习模型由于其复杂性&#xff0c;往往容易出现过拟合的问题。以下是一些深度学习中常见的过拟合原因和解决方法&#xff1a; 1. 数据量不足&#xff1a;深度学习模型通常需要大量的数据来进行训练&#xff0c;如果数据量不足&#xff0c;模型容易过度…

使用Python抓取抖音直播间数据的简易指南【第152篇—抓取数据】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 使用Python抓取抖音直播间数据的简易指南 说明&#xff1a;本文已脱敏&#xff0c;隐去地址…

JVM快速入门(1)JVM体系结构、运行时数据区、类加载器、线程共享和独享、分区、Java对象实例化

5.1 JVM体系结构 线程独占区-程序计数器&#xff08;Program Counter Register&#xff09; 程序计数器是一块较小的内存空间&#xff0c;它可以看做是当前线程所执行的字节码的行号指示器&#xff1b;在虚拟机的概念模型里&#xff0c;字节码解释器工作时就是通过改变这个计数…

如何解决Layui后台接口返回数据,但是table.render不渲染表格数据的问题

我这边进行了pareData数据格式转换&#xff0c;response重新定义了layui的参数格式规范 接口正常返回了数据 但是就是不渲染&#xff0c;我这个郁闷啊&#xff01;&#xff01; 忽然&#xff0c;我把后台重新定义的layui规定的格式参数&#xff0c;有个参数名叫data&#xff0…

Day 1 二分算法(C++)

算法简介 二分查找&#xff08;Binary Search&#xff09;是一种常见的查找算法&#xff0c;它适用于已经排序好的数组或列表。它的基本思想是不断地将待查找区间分成两半&#xff0c;并通过比较目标值与中间元素的大小关系来确定目标值在哪一半中&#xff0c;从而缩小查找范围…

【leetcode热题】 位1的个数

编写一个函数&#xff0c;输入是一个无符号整数&#xff08;以二进制串的形式&#xff09;&#xff0c;返回其二进制表达式中数字位数为 1 的个数&#xff08;也被称为汉明重量&#xff09;。 提示&#xff1a; 请注意&#xff0c;在某些语言&#xff08;如 Java&#xff09;中…