Vue3中shallowRef和shallowReactive的使用?

news2025/1/14 4:20:39

shallowRef 和 shallowReactive

  • 前言
    • shallowRef 和 shallowReactive概述区别
    • shallowReactive
    • shallowRef
    • 总结:
    • 注意

为什么使用shallowRef和shallowReactive?
我们在之前的博客进过 ref 函数和 reactive 函数,他们的作用是将数据转换成响应式的数据,在修改数据的时候,可以将数据实时展示在页面上,基本数据也好,对象也好,都是这样。但是有一个问题呀,我们在把数据改为响应式数据的时候,不管是用 ref 函数还是使用 reactive 函数,他俩都是深度监听,啥意思呢? 就是 reactive 包裹的对象,就算有100层,也就是连续点一百个属性那种,去修改最深层的数据也是可以监听到的,这样的话就会存在问题了
深度监听的问题:

  • 无论 ref 函数还是 reactive 函数都是深度监听
  • 如果数据量过大,超级超级消耗性能
  • 如果我们不需要对数据进行深度监听的时候,就可以使用 shallowRef 函数和 shallowReactive 函数

前言

shallowReactive和shadowRef就是浅层的reactive和ref。可以理解成,shallowReactive只能处理引用类型,只能监听对象的最外层属性,如果深度属性发生改变,是监听不到的,没法实现响应式。shallowRef和ref不同,只能处理基本类型,不能处理引用类型。处理基本类型的时候和ref一样

shallowRef 和 shallowReactive概述区别

shallowReactive:只处理对象最外层属性的响应式(浅响应式)。

shallowRef:只处理基本数据类型的响应式, 不进行对象的响应式处理。

shallowReactive

浅层作用的响应式数据处理,也就是只处理第一层对象的数据,在往下嵌套的数据,操作数据是不起作用的;与reactive()不同,没有深层及的转换,一个浅层响应式对象里只有根级别的属性是响应式的,属性的值会被原样存储和暴露,这意味着值为ref的属性不会被自动解构的

例如:如果有一个对象数据,数据结构比较深,复杂,但变化时只需要外层属性变化,那么就可以使用shallowReactive。
<template>
    <div>
      <h1>shallowReactive姓名:{{ name }}</h1>
      <h1>shallowReactive年龄:{{ news.age }}</h1>
      <button @click="reactivebtn">修改name</button>
      <button @click="btn2">修改age</button>
      <hr />
    </div>
  </template>
  
  <script>
  import { shallowReactive, toRefs, shallowRef } from "vue";
  export default {
    name: "App",
    setup() {
  // shallowReactive的练习
      const boy = shallowReactive(
        {  //shallowReactive 函数,只能处理第一层数据(浅响应式) 
        name: "Reactive",
        news: {
          age: 10,
        },
      }
      );
      const reactivebtn = () => {
        boy.name += 1;
      };
      const btn2 = () => {
        boy.news.age+=1;
      };

  // shallowRef的练习

  //结论:shallowReative与shallowRef在某些特殊的应用场景下,是可以提升性能的;
  // 前者针对对象,用于浅层作用的响应式数据处理,而后者只处理基本数据类型的响应式,不进行对象的响应式处理
      return { ...toRefs(boy), reactivebtn, btn2 };
    },
  };
  </script>

我们修改数据只有定义在对象第一层的属性 才是响应式的 深层次的数据将不在具有响应式的功能 因为深层次的数据将不在是一个响应式对象 而是一给普通对象

shallowRef

<template>
    <div>
      <h1>shallowRef姓名:{{ refboy }}</h1>
      <h1>shallowRef年龄:{{refobj.refnews.age  }}</h1>
      <button @click="refbtn">修改refboy</button>
      <button @click="refobj_btn">修改age</button>
    </div>
  </template>
  
  <script>
  import { shallowReactive, toRefs, shallowRef } from "vue";
  export default {
    name: "App",
    setup() {
  // shallowRef的练习
      const refboy = shallowRef("Ref张三"); //shallowRef 函数,只能处理基本类型数据
      const refobj = shallowRef({
        refnews: {
          birthday: "2012-10-14",
          age: 11,
        },
      });
      const refbtn = () => {
        refboy.value += "*";
       
      };
      const refobj_btn=()=>{
        refobj.value.refnews.age +='ref'
        console.log(refobj.value.refnews,'11');
      }
  //结论:shallowReative与shallowRef在某些特殊的应用场景下,是可以提升性能的;
  // 前者针对对象,用于浅层作用的响应式数据处理,而后者只处理基本数据类型的响应式,不进行对象的响应式处理
      return { refboy, refbtn,refobj,refobj_btn }; //, ...toRefs(boy), reactivebtn, btn2
    },
  };
  </script>
  

总结:

shallowReative与shallowRef在某些特殊的应用场景下,是可以提升性能的,前者针对对象,用于浅层作用的响应式数据处理,而后者只处理基本数据类型的响应式,不进行对象的响应式处理。

注意

在这里插入图片描述

按照vue3文档中得说明,在使用shallowRef和shallowReactive是浅响应的,即修改深层数据视图应该是不更新得,但是使用过程中往往会出现视图更新得情况;发现视图更新了,这是为什么呢?
原因是有其他响应式数据更新了,从而触发了视图更新:
在这里插入图片描述

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

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

相关文章

真空压力控制方法在X射线探测器窗口薄膜材料力学性能测试中的应用

摘要&#xff1a;针对X射线窗口膜材料机械性能测试中对真空度和高压压力的准确控制需要&#xff0c;本文提出了相应的解决方案。解决方案中采用了薄膜电容真空计、压力传感器、电动针阀、压力调节阀和真空压力PID控制器&#xff0c;与真空泵和高压气源配合&#xff0c;可在膜材…

5Element

一、Element-快速入门 1、安装ElementUi组件库 输入npm install element-ui2.15.3 2、引入ElementUi组件库 https://element.eleme.cn/#/zh-CN/component/quickstart //引入element-ui import ElementUI from element-ui; import element-ui/lib/theme-chalk/index.css;Vue.…

Java魔法类 Unsafe应用解析

前言 Unsafe是位于sun.misc包下的一个类&#xff0c;主要提供一些用于执行低级别、不安全操作的方法&#xff0c;如直接访问系统内存资源、自主管理内存资源等&#xff0c;这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Ja…

【Linux】man什么都搜不了,No manual entry for xxx的解决方案

本文首发于 慕雪的寒舍 man什么都搜不了&#xff0c;No manual entry for xxx的解决方案 系统 CentOS 7.6 1.问题描述 今天查手册的时候&#xff0c;发现man什么都查不了。不管是系统接口还是函数&#xff0c;都显示没有入口文档&#xff08;No manual entry for&#xff09;…

狂追ChatGPT:开源社区的“平替”热潮

目前&#xff0c;不少优质的类ChatGPT模型都只能通过API接入&#xff0c;而一些开源LLM的效果与ChatGPT相比差距不小。不过&#xff0c;近期开源社区开始密集发力了。 其中&#xff0c;Meta的LLaMA模型泄漏是开源“ChatGPT”运动的代表性事件。基于LLaMA模型&#xff0c;开源社…

条款08: 别让异常逃离析构函数

文章目录背景知识析构函数背景知识 下面是一段测试代码&#xff1a; class Test { public:Test(int para){m_num para;};void test_throw(){throw(3);};~Test() {cout<<"delete Test"<<m_num<<endl;//test_throw();};int m_num; }; int main() …

牛客乔迁新居,新址在……

有个好消息想向大家公布&#xff1a;牛客&#xff08;上海办公室&#xff09;搬家啦&#xff01; 自3月27日起&#xff0c;牛客&#xff08;上海办公室&#xff09;正式乔迁至上海市长宁区长宁路999号兆丰广场办公楼G层G15。新的办公室坐落在上海长宁区的中心地带&#xff0c;…

Talk预告 | 浙江大学特聘研究员廖依伊:面向自动驾驶仿真平台的神经渲染

本期为TechBeat人工智能社区第477期线上Talk&#xff01; 北京时间3月1日(周三)20:00&#xff0c;浙江大学信电学院特聘研究员——廖依伊的Talk将准时在TechBeat人工智能社区开播&#xff01; 她与大家分享的主题是: “面向自动驾驶仿真平台的神经渲染”&#xff0c;届时将探…

VSCode 配置PyQt5 开发环境

前提要求&#xff1a;Windows 安装Anaconda。 如果没有安装&#xff0c;请参考文章:Windows安装Anaconda使用教程 1、PyQt 5 安装 在配置python环境的时候需要注意&#xff0c;PyQt5需要python 3.5以上的版本&#xff0c;在python环境中(conda、pipenv)安装pyqt5相关组件Py…

4.13(LoadLibrary)

接着之前预习的知识&#xff0c;我观察的自己编译出来的bin LoadLibraryExA LoadLibraryExA函数进去&#xff0c;现时用RtInitAnsiString函数初始化了ANSI的计数字符串&#xff0c;底层是调用了LoadLibraryExW函数&#xff0c;在LoadLibrarExW函数里做了unicode的计数字符串的…

分子生物学 第三章 基因、基因组及基因组学

文章目录第三章 基因、基因组及基因组学第一节 基因1 基因认识的三个阶段2 基因的特征(1)跳跃基因(2)断裂基因3 基因的分类4 基因的结构5 基因的大小6 基因的数目第二节 基因组1 基因组的概念2 噬菌体基因组3 细菌基因组以大肠杆菌(原核生物的代表)为研究对象4 酵母基因组以酵母…

Python之拯救Xubuntu22.04误删/usr/bin/python3.10(二十二)

0.首先删除/usr/bin/python3.10,会导致以下错误: <1>.报错1: ModuleNotFoundError: No module named ‘apt_pkg’ <2>.报错2: bash: /usr/lib/command-not-found: /usr/bin/python3: 解释器错误: 没有那个文件或目录 <3>.报错3: 通过亲身操作,以下步骤可…

【Linux】来写一个tcp的服务端+客户端

本文首发于 慕雪的寒舍 今天让我们来写一个tcp的服务器/客户端代码。 完整代码见我的gitee 链接 阅读本文前&#xff0c;建议先阅读&#x1f449; udp服务器 由于本文采用自建图床&#xff0c;CSDN可能因带宽不够&#xff0c;出现外链图片缓存失败。 1.基本框架 tcp的服务器…

walt 调度算法

Walt 算法 WALT负载统计原理_walt算法_森森浅浅笙笙的博客-CSDN博客 CPU负载均衡之WALT学习【转】_mb5fdcad0be2e90的技术博客_51CTO博客 1、A task’s demand is the maximum of its contribution to the most recently completed window and its average demand over the p…

webgl-attribute、uniform、varying三者的区别

通用js: let canvas document.getElementById(webgl) canvas.width window.innerWidth canvas.height window.innerHeight let ctx canvas.getContext(webgl) attribute&#xff1a; 范围: 只适用于vertexShader&#xff0c;将js代码中的数据传递给vertexShader。 使用方…

知识图谱扩充|蜕变测试|蜕变关系

目录 前言&#xff1a;概念定义 什么是蜕变测试&#xff1f; 那么&#xff0c;怎么进行蜕变测试呢&#xff1f; 1. 生成蜕变关系 a 等价关系 b 混排关系 c 交集关系 d 并集关系 2. 生成蜕变用例 3. 执行蜕变用例 4. 校验蜕变关系 学术报告 一、蜕变测试MT 二、蜕变…

【id:32】【20分】B. Date(类与构造)

题目描述 下面是一个日期类的定义&#xff0c;请在类外实现其所有的方法&#xff0c;并在主函数中生成对象测试之。 注意&#xff0c;在判断明天日期时&#xff0c;要加入跨月、跨年、闰年的判断 例如9.月30日的明天是10月1日&#xff0c;12月31日的明天是第二年的1月1日 2月…

vue2路由(下)

编程式路由导航 通过点击按钮实现push和replace俩种模式的跳转 实现&#xff1a;就是通过$router原型里面的方法 也能实现路由的跳转和后退&#xff0c;分别采用的是$router里面的black和forward方法 感觉就是BOM对象中的history对象里面的方法 正是前进&#xff0c;后是后…

快鲸scrm | 三个步骤,快速打造企业长效私域营销阵地

快鲸scrm对企业微信私域流量玩法进行系统梳理&#xff0c;把企业微信用户运营拆解为“获客”、“转化”和“服务”这三个关键步骤&#xff0c;从点到面&#xff0c;为企业私域运营提供可行性的解决方案。 一、构建私域流量管理机制 用户是企业发展的基础&#xff0c;用户增长对…

三电技术之电控技术

三电技术之电控技术 1 基本功能 整车控制系统能够实现对汽车动力、舒适度、安全性以及能耗等多方面进行调整优化&#xff0c;配合大数据让电动汽车拥有更好的操作性和可靠性&#xff0c;具体来讲整车控制器对电动汽车主要有以下功能&#xff1a; 数据交互管理&#xff1a;整…