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

vue3 响应式 API:shallowRef()和shallowReactive()

shallowRef()

shallowRef()是一个用于创建浅层响应式引用的函数。它创建一个响应式数据,但只对顶层属性进行响应式处理。

特点: 只跟踪引用值的变化,不关心值内部的属性变化。

<template><div>{{ shallowRefObj }}</div><button @click="changeShallowRefObj">直接修改shallowRefObj</button><button @click="changeMessage">修改message属性</button>
</template>
<script setup lang="ts">
import { shallowRef } from 'vue';
const shallowRefObj = shallowRef({ message: 'Hello' 
})const changeShallowRefObj = () => {// 以下操作会触发响应式更新,因为直接修改了引用本身shallowRefObj.value = { message: 'hello World!' }
}const changeMessage = () => {// 以下操作不会触发响应式更新,因为只是修改了引用对象的属性shallowRefObj.value.message = 'New message'console.log('执行changeMessage()后:', shallowRefObj)
}
</script>
  1. 执行changeShallowRefObj方法,修改shallowRefObj,触发响应式更新:
    在这里插入图片描述
  2. 执行changeMessage 方法,修改shallowRefObjmessage属性,不会触发响应式更新。
  • 执行方法后,devtools查看setup里的数据、页面渲染结果如上图所示,shallowRefObjmessage属性值没有任何改变。
  • 查看console.log('执行changeMessage()后:', shallowRefObj)在控制台的打印结果:shallowRefObjmessage属性值已经被修改。
    在这里插入图片描述

ref()的区别

  • ref()创建的是深度响应式引用,对引用对象的属性的修改也会触发响应式更新。
  • shallowRef()创建的浅层 ref 的内部值将会原样存储和暴露,并且不会被深层递归地转为响应式。只有对 .value 的访问是响应式的。

应用场景

shallowRef() 常常用于对大型数据结构的性能优化或是与外部的状态管理系统集成。



shallowReactive()

shallowReactive()是一个用于创建浅层响应式对象的函数。

shallowReactive()创建的响应式对象是浅层的:

  • 只有对象的直接属性是响应式的,对象内部的嵌套属性不是响应式的。
<template><div>{{ shallowReactiveObj }}</div><button @click="changeMessage">修改message属性</button><button @click="changeProperty">修改property属性</button>
</template>
<script setup lang="ts">
import { shallowReactive } from 'vue';
const shallowReactiveObj = shallowReactive({message: 'Hello',nestedObject: {property: 'value'}
});const changeMessage = () => {// 以下操作会触发响应式更新,因为直接修改了浅层响应式对象的属性shallowReactiveObj.message = 'hello World!'
};const changeProperty = () => {//  以下操作不会触发响应式更新,因为是修改嵌套对象的属性shallowReactiveObj.nestedObject.property = 'New Value';console.log('执行changeProperty()后:', shallowReactiveObj);
};
</script>
  1. 执行changeMessage方法,修改浅层响应式对象shallowReactiveObjmessage属性,触发响应式更新:

在这里插入图片描述

  1. 执行changeProperty方法,修改浅层响应式对象shallowReactiveObj 的嵌套属性property,不会触发响应式更新:
  • 执行方法后,devtools查看setup里的数据、页面渲染结果如上图,shallowReactiveObj的嵌套属性property没有任何改变。
  • 查看console.log('执行changeProperty()后:', shallowReactiveObj);在控制台的打印结果:shallowReactiveObj的嵌套属性property已经被修改。
    在这里插入图片描述

reactive()的区别

  • reactive()创建的是深度响应式对象,对象的所有属性(包括嵌套对象的属性)都是响应式的。
  • shallowReactive()创建的浅层响应式对象里只有根级别的属性是响应式的。属性的值会被原样存储和暴露,这也意味着值为 ref 的属性不会被自动解包了。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • orcad画封装,如何隐藏引脚编号,线宽
  • 【MySQL】初识MySQL—MySQL是啥,以及如何简单操作???
  • [环境配置]Pycharm手动安装汉化插件
  • c/c++ 指针数组
  • 05:【江科大stm32】:定时器输出比较功能(PWM)
  • Facebook 小店:不出单?没流量?如何解决?
  • Facebook的AI进化:如何用智能技术提升内容推荐
  • ubuntu 安装 jdk
  • “99公益日”绿葆携手一镇一业,捐赠价值8万元的取袋机等物资
  • Unity中使用四元数限制旋转
  • 算法笔记|Day40动态规划XIII
  • 智汇云舟受邀参加2024第四届国产水科学数值模型开发创新与技术应用研讨会,并成为“科技智水产业联盟”创始成员
  • 【个人笔记】VCS工具与命令
  • 【STM32】通用定时器TIM(时钟源选择与更新中断)
  • 全系统各类型工程水土保持方案编制实践技术
  • Google 是如何开发 Web 框架的
  • 10个最佳ES6特性 ES7与ES8的特性
  • css选择器
  • js写一个简单的选项卡
  • k8s 面向应用开发者的基础命令
  • MySQL主从复制读写分离及奇怪的问题
  • NSTimer学习笔记
  • React-Native - 收藏集 - 掘金
  • React-redux的原理以及使用
  • swift基础之_对象 实例方法 对象方法。
  • vue学习系列(二)vue-cli
  • 二维平面内的碰撞检测【一】
  • 数据结构java版之冒泡排序及优化
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 移动端 h5开发相关内容总结(三)
  • 译有关态射的一切
  • elasticsearch-head插件安装
  • # 透过事物看本质的能力怎么培养?
  • #NOIP 2014# day.2 T2 寻找道路
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (2)空速传感器
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (Note)C++中的继承方式
  • (附源码)ssm本科教学合格评估管理系统 毕业设计 180916
  • (附源码)计算机毕业设计SSM基于健身房管理系统
  • (七)Flink Watermark
  • (三十五)大数据实战——Superset可视化平台搭建
  • (一)Java算法:二分查找
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转)fock函数详解
  • (转)详解PHP处理密码的几种方式
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .NET Core引入性能分析引导优化
  • .NET 读取 JSON格式的数据
  • .net 流——流的类型体系简单介绍
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • @Transactional 参数详解