vue3 子组件属性响应性丢失分析总结(四)

一、先看例子:

<script setup lang="ts">
import { onMounted, reactive, ref, watch } from 'vue';
import Test from '@/components/Test.vue';
	let a = {a:"a"};
	const aRef = ref(a);
	var aReactive = reactive(a);

	let bObj = "B";
	const bObjRef = ref(bObj);
	watch(testB, async (newAttr, oldAttr) => {
        let cReactive = reactive({a:newAttr});
		aReactive = cReactive;
	})

</script>
<template>
	<div style="display: block;">
		<input v-model="testB"/>
		<Test  :a="a" :aRef="aRef" :aReactive="aReactive" :bObj="bObj"  :bObjRef="bObjRef" ></Test>
	</div>
	
</template>
<script setup lang="ts">
import { computed, reactive, ref, watch } from 'vue';

	const props = defineProps({
	  a:Object,
	  aRef:{type:Object, required:true},
	  aReactive:Object,
	  bObj:String,
	  bObjRef:String,
	});
	const aReactive = props.aReactive;
	
</script>
<template>
	<div> props.a ->  {{props.a}} </div>
	<div> props.aRef ->  {{props.aRef}} </div>
	<div> props.aReactive ->  {{props.aReactive}} </div>
	<div> aReactive ->  {{aReactive}} </div>
	<div> props.bObj ->  {{props.bObj}} </div>
	<div> props.bObjRef ->  {{props.bObjRef}} </div>
	<van-cell-group inset>
	  <van-field v-model="aReactive.a" label="标题" placeholder="输入框左侧文本"  >
	  </van-field>
	</van-cell-group>
</template>
<style>
</style>

 我们在我们在父组件修改输入框testB的值,会发现,子组件响应式更新的只有以props开始访问的模块会自动更新,其他以aReactive开始访问的没有更新。

二、为什么会这样呢?

首先我们可以确定aReactive是一个reactive对象。为什么其响应式丢失了呢?

 这里面究竟发生了什么?

实际逻辑分析如下:

  1. 用户在父组件的输入框输入新的字符串。
  2. 触发监听,然后脚本修改aReactive的值。
  3. 由于子组件的props具有响应性,其内在触发器触发,props.aReactive的修改为了cReactive
  4. 子组件中const aReactive = props.aReactive; 此时不会再次执行,该脚本只在子组件初始化时执行了一次,这行代码并没有在props响应式的触发器范围内。所以子组件内的变量aReactive值reactive类型,其代理的值还是之前{a:"a"},而props.aReactive的值也是reactive类型,但其代理的值是{a:"C"}
  5. 所以最终结果就出现了上面的情况。

原因分析清楚了,那么接下来如何达到我们想要的结果呢?

三、解决办法

最简单直接的办法就是使用computed。如:

const aReactive = computed(()=>{return props.aReactive});;

当然也可以使用其他方法,类似watch等。

    const aReactive = ref(props.aReactive);
	watch(()=>props.aReactive, (newAttr, oldAttr) => {
			aReactive.value = newAttr;
	})

四、总结

造成响应式丢失的原因就是没有正确的获取到代理对象。aReactive对象获取不对,所以导致响应性丢失。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins同一个项目不同分支指定不同JAVA环境

背景 一些系统应用,会为了适配不同的平台,导致不同的分支下用的是不同的gradle,导致需要不同的JAVA环境来编译,比如a分支需要使用JAVA11, b分支使用JAVA17。 但是jenkins上,一般都是Global Tool Configuration 全局所有环境公用一个JAVA_HOME。 尝试过用 Build 的Execut…

实现可拖拽的 Ant Design Modal 并保持下层 HTML 可操作性

前言 在开发复杂的前端界面时&#xff0c;我们常常需要一个可拖拽的弹窗&#xff08;Modal&#xff09;&#xff0c;同时又希望用户能够在弹窗打开的情况下操作下层的内容。Ant Design 的 Modal 组件提供了强大的功能&#xff0c;但默认情况下&#xff0c;弹窗会覆盖整个页面&…

网络安全三件套

一、在线安全的四个误解     Internet实际上是个有来有往的世界&#xff0c;你可以很轻松地连接到你喜爱的站点&#xff0c;而其他人&#xff0c;例如黑客也很方便地连接到你的机器。实际上&#xff0c;很多机器都因为自己很糟糕的在线安全设置无意间在机器和系统中留下了“…

Jetson Agx Orin平台JP6.0-r36.3版本修复了vi模式下的原始图像损坏(线条伪影)

1.问题描述 这是JP-6.0 GA/ l4t-r36.3.0的一个已知问题 通过vi模式捕获的图像会导致异常线条 参考下面的快照来演示这些线伪影 这个问题只能通过VI模式进行修复,不应该通过LibArgus看到。 此外,这是由于内存问题。 由于upstream已经将属性名称更改为“dma-noncoherent”…

封装neo4j的持久层和服务层

目录 持久层 mp 模仿&#xff1a; 1.抽取出通用的接口类 2.创建自定义的repository接口 服务层 mp 模仿&#xff1a; 1.抽取出一个IService通用服务类 2.创建ServiceImpl类实现IService接口 3.自定义的服务接口 4.创建自定义的服务类 工厂模式 为什么可以使用工厂…

Spring Boot (maven)分页2.0版本

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

Docker安装Minio对象存储

介绍 MinIO 是一种对象存储解决方案&#xff0c;提供与Amazon Web Services S3兼容的API并支持所有核心S3功能。MinIO可部署在任何地方&#xff1a;公共云或私有云、裸机基础设施、编排环境和边缘基础设施。 详情参见官方文档&#xff1a;MinIO Object Storage for Container…

BERT 大模型

BERT 大模型 EmbeddingTransformer预微调模块预训练任务 BERT 特点 : 优点 : 在语言理解相关任务中表现很好缺点 : 更适合 NLU 任务&#xff0c;不适合 NLG 任务 BERT 架构&#xff1a;双向编码模型 : Embedding 模块Transformer 模块预微调模块 Embedding Embedding 组成 …

cmake:定位Qt的ui文件

如题。在工程中&#xff0c;将h&#xff0c;cpp&#xff0c;ui文件放置到不同文件夹下&#xff0c;会存在cmake找不到ui文件&#xff0c;导致编译报错情况。 cmake通过指定文件路径&#xff0c;确保工程找到ui文件。 标识1&#xff1a;ui文件保存路径。 标识2&#xff1a;添加…

DFS算法篇:理解递归,熟悉递归,成为递归

1.DFS原理 那么dfs就是大家熟知的一个深度优先搜索&#xff0c;那么听起来很高大尚的一个名字&#xff0c;但是实际上dfs的本质就是一个递归&#xff0c;而且是一个带路径的递归&#xff0c;那么递归大家一定很熟悉了&#xff0c;大学c语言课程里面就介绍过递归&#xff0c;我…

H5自适应响应式代理记账与财政咨询服务类PbootCMS网站模板 – HTML5财务会计类网站源码下载

(H5自适应)响应式代理记账财政咨询服务类pbootcms网站模板 html5财务会计类网站源码下载 为了提升系统安全&#xff0c;请将后台文件admin.php的文件名修改一下。修改之后&#xff0c;后台登录地址就是&#xff1a;您的域名/您修改的文件名.php 模板特点&#xff1a; 1&#x…

嵌入式音视频开发(二)ffmpeg音视频同步

系列文章目录 嵌入式音视频开发&#xff08;零&#xff09;移植ffmpeg及推流测试 嵌入式音视频开发&#xff08;一&#xff09;ffmpeg框架及内核解析 嵌入式音视频开发&#xff08;二&#xff09;ffmpeg音视频同步 嵌入式音视频开发&#xff08;三&#xff09;直播协议及编码器…

工业自动化丨工业控制系统五层架构以及PLC、SCADA系统、DCS系统,从零基础到精通,收藏这篇就够了!

工业控制系统通常是几种类型控制系统的总称&#xff0c;包括监控和数据采集&#xff08;SCADA&#xff09;系统、分布式控制系统&#xff08;DCS&#xff09;和可编程逻辑控制器&#xff08;PLC&#xff09;以及其它控制系统。 【右下角**点赞、**转发、在看&#xff0c;为企业…

✨1.HTML、CSS 和 JavaScript 是什么?

✨✨ HTML、CSS 和 JavaScript 是构建网页的三大核心技术&#xff0c;它们相互协作&#xff0c;让网页呈现出丰富的内容、精美的样式和交互功能。以下为你详细介绍&#xff1a; &#x1f98b;1. HTML&#xff08;超文本标记语言&#xff09; 定义&#xff1a;HTML 是一种用于描…

MySQL基本操作——包含增删查改(环境为Ubuntu20.04,MySQL5.7.42)

1.库的操作 1.1 创建数据库 语法&#xff1a; 说明&#xff1a; 大写的表示关键字 [] 是可选项 CHARACTER SET: 指定数据库采用的字符集 COLLATE: 指定数据库字符集的校验规则 1.2 创建案例 创建一个使用utf8字符集的db1数据库 create database db1 charsetutf8; …

【项目】基于STM32F103C8T6的四足爬行机器人设计与实现(源码工程)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【项目】基于STM32F103C8T6的四足爬行机器人设计与…

IIS asp.net权限不足

检查应用程序池的权限 IIS 应用程序池默认使用一个低权限账户&#xff08;如 IIS_IUSRS&#xff09;&#xff0c;这可能导致无法删除某些文件或目录。可以通过以下方式提升权限&#xff1a; 方法 1&#xff1a;修改应用程序池的标识 打开 IIS 管理器。 在左侧导航树中&#x…

【数据结构】队列(Queue)

Queue 定义 Java中的队列(Queue)是一种先进先出(FIFO)的数据结构。队列只允许在一段进行插入数据操作&#xff0c;称为入队&#xff0c;在另一端进行删除数据操作&#xff0c;称为出队。我们可以把队列形象看作为排队。在最前面的进行出队&#xff0c;从最后面进行入队。 队列…

从零搭建微服务项目Base(第5章——SpringBoot项目LogBack日志配置+Feign使用)

前言&#xff1a; 本章主要在原有项目上添加了日志配置&#xff0c;对SpringBoot默认的logback的配置进行了自定义修改&#xff0c;并详细阐述了xml文件配置要点&#xff08;只对日志配置感兴趣的小伙伴可选择直接跳到第三节&#xff09;&#xff0c;并使用Feign代替原有RestT…

Linux 网络安全技巧

网络安全是一个非常重要的课题,基本上你运行的服务后台越多,你就可能打开更多的安全漏洞.如果配置的恰当的话,Linux本身是非常安全可靠的,假使在Linux系统中有某个安全缺陷,由于Linux的源码是开放的&#xff0c;有成千上万的志愿者会立刻发现并修补它。本文旨在介绍用来增强你的…