当前位置: 首页 > news >正文

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对象获取不对,所以导致响应性丢失。

相关文章:

  • TMS320F28335二次bootloader在线IAP升级
  • 在windows10上,部署DeepSeek模型在本地电脑
  • 【钱包】【WEB3】【Flutter】一组助记词如何推导多个账号钱包
  • Unity 淡入淡出
  • agent和android怎么结合:健康助手,旅游助手,学习助手
  • 【插入排序】Insert_Sort
  • 电机控制::软件架构::微型软件架构
  • 基于开源Odoo、SKF Phoenix API与IMAX-8数采网关的圆织机设备智慧运维实施方案 ——以某纺织集团圆织机设备管理场景为例
  • I²C简介
  • OSPF协议五种网络类型中DR和BDR选举说明
  • Linux内核实时机制4 - 实时改造优化 - PREEMPT_RT方案
  • Linux学习笔记之深入理解进程调度
  • 3、cadence从零开始让一个VCO起振——如何调频
  • 复现log4j2的jndi注入成功反弹shell
  • SQL进阶技巧:如何统计用户跨端消费行为?
  • (leetcode 1749 前缀和)1749. 任意子数组和的绝对值的最大值
  • 【嵌入式Linux应用开发基础】进程实战开发
  • 华为固态电池引发的思索
  • 2.18寒假
  • 06:高级命令
  • 巴基斯坦空袭印度多地空军基地,巴战机进入印领空
  • 伤员回归新援融入,海港逆转海牛重回争冠集团
  • 巴基斯坦军方:印度导弹袭击巴首都附近空军基地
  • 央行:中国政府债务扩张仍有可持续性
  • 一企业采购国产化肥冒充“挪威化肥”:7人被抓获
  • 家庭相册㉙在沪打拼25年,我理解了父母清晨去卖蜜饯的辛苦