vue3的shallowReactive和shallowRef,readonly和shallowReadonly

news2024/11/25 1:05:03
  • shallowReactive:只处理对象最外层属性的响应式(浅响应式)
<template>
    <span>姓名:{{name}}</span>
    <span>年龄:{{age}}</span>
    <span>职业:{{salary.job.num}}</span>
    <button @click="name += '~'">{{name}}</button>
    <button @click="age ++">{{age}}</button>
    <button @click="salary.job.num += 'ba'">{{salary.job.num}}</button><br />
</template>
<script>
import { reactive ,toRefs,shallowReactive} from 'vue';
export default {
    name: 'toRef',
    setup() {
        // let person = reactive({ // 此时person里面的对象比如salary.job.num都具有响应式
            let shallowPerson = shallowReactive({ // 此时就只有最外层(最浅的那层具有响应式所以叫shallow)此时的num属性不具有响应式了
            name:"james",
            age:38,
            salary:{
                job:{
                    num:'ba'
                },
            }
        });
        console.log(shallowPerson)
        const p = toRefs(shallowPerson);// 使用toRefs同样不能使深层次的达到响应的效果
        return {
            shallowPerson,
            ...p, 
        };
    }
}
</script>
  • shallowRef:只处理基本数据类型的响应式,不进行对象的响应式处理
<template>
    <button @click="num++">{{num}}</button>
    <button @click="num2++">{{num2}}</button>
    <button @click="obj1.num++">{{obj1.num}}</button>
    <button @click="obj2.num++">{{obj2.num}}</button> // 此时加的话页面上的数据就不会有变化了
</template>
  
<script>
import { reactive ,toRefs,shallowReactive,shallowRef,ref} from 'vue';
export default {
    name: 'toRef',
    setup() {

        let person = reactive({ // 此时person里面的对象比如salary.job.num都具有响应式
            name:"james",
            age:38,
            salary:{
                job:{
                    num:'ba'
                },
            }
        });

        let num = ref(0); 
        let num2 = shallowRef(0);//此时这两者并没有很大的区别

        let obj1 = ref({num:0});let obj2 = shallowRef({num:0});
        // 此时两者就有区别了,ref定义的数据还是具有响应式的因为ref会借助reactive来给引用类型的数据增加响应式的
        // 但是shallowRef就不会了,此时obj2.num就不具备响应式了
        console.log(obj1,obj2);

        return {
            num,
            num2,
            obj1,
            obj2
        };
    }
}
</script>

在这里插入图片描述
ref通过reactive让其对象使用Proxy来产生数据的响应式

使用情况

  1. 一个对象,结构较深,但变化的只是最外层属性变化 就用shallowReactive
  2. 一个对象,后续功能不会修改该对象中的属性,而会被最新的对象进行替换 就用shallowRef
  • readonly和shallowReadonly ,一切尽在代码中
<template>
    <button @click="noChange.age++">{{  noChange.age  }}</button>
    <button @click="shallowChange.age++">{{  shallowChange.age  }}</button> <!-- 不可修改的 -->
    <button @click="shallowChange.salary.job.num++">{{  shallowChange.salary.job.num  }}</button>  <!-- 可修改的 -->
</template>
  
<script>
import { reactive, toRefs, shallowReactive, shallowRef, ref,readonly, shallowReadonly } from 'vue';
export default {
    name: 'toRef',
    setup() {

        let person = reactive({ // 此时person里面的对象比如salary.job.num都具有响应式
            name: "james",
            age: 38,
            salary: {
                job: {
                    num: 11
                },
            }
        });

        let num = ref(0);
        num = readonly(num);// readonly也适用于ref shallowReadonly也是适用的 但是没必要这样使用,shallowReadonly一般适用于有层次的对象

        let noChange = readonly(person);// 此时noChange和person里面的数据一样的 但是不能进行修改的,修改的话控制台会报警告的
        let shallowChange = shallowReadonly(person);// 因为带了shallow顾名思义,这个就是对象的最外层变成只可读的,但是深层次的是可以修改的
        return {
            noChange,
            shallowChange
        };
    }
}
</script>
  

在这里插入图片描述

  1. readonly:让一个响应式数据变为只读的(深层次也只读)
  2. shallowReadonly:让一个响应式数据变为只读的(浅只读)
  3. 应用场景:当接受一个别人传过来的值,或者后端给的值,然后我们不能进行修改的就可以用该属性

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

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

相关文章

JAVA SE复习(第5章 面向对象(上))

本文笔记来自硅谷柴林燕老师的笔记 只为自己看笔记方便使用 不做他用5.1 面向对象编程5.1.2 类和对象1、什么是类类是一类具有相同特性的事物的抽象描述&#xff0c;是一组相关属性和行为的集合。属性&#xff1a;就是该事物的状态信息。行为&#xff1a;就是在你这个程序中&am…

springboot集成kafka

选择特定版本spring-kafka官方使用文档 进入官网&#xff1a;https://spring.io/ 选择自己使用版本 点进去后按照 /2.7.0/reference/html/ 路径点进去就能看到想要版本的文档了

C++实现线程池

C实现线程池一、前言二、线程池的接口设计2.1、类封装2.2、线程池的初始化2.3、线程池的启动2.4、线程池的停止2.5、线程的执行函数run()2.6、任务的运行函数2.7、等待所有线程结束三、测试线程池四、源码地址总结一、前言 C实现的线程池&#xff0c;可能涉及以下知识点&#…

JVM - 垃圾回收

目录 垃圾回收基础和根搜索算法 垃圾回收概述 根搜索算法 引用分类 垃圾回收基础(跨代引用、记忆集、写屏障、判断垃圾的步骤、STW) 跨代引用 记忆集(Remembered Set) 写屏障 判断是否垃圾的步骤 GC类型 Stop-The-World 垃圾收集类型 判断类无用的条件 垃圾回收算…

Mybatis源码(2) - SqlSessionTemplate的介绍及创建过程

0. 前言1. Spring对SqlSessionTemplate的管理1.1. SqlSessionTemplate的创建&#xff1a;1.2. MapperProxy中sqlSession的来源&#xff1a;2. SqlSessionInterceptor中的getSqlSession0. 前言 众所周知&#x1f60f;:MyBatis通过SqlSessionFactory 创建SqlSession去调用Executo…

在VMware17 Pro中设置创建虚拟机Ubuntu 20

在VMware17 Pro中设置创建虚拟机Ubuntu 200 前言1 安装Ubuntu 20步骤0 前言 书接上回&#xff0c;安装好了VMware17 Pro之后&#xff0c;就是安装虚拟机了&#xff0c;前提是下好了系统安装包&#xff0c;以Ubuntu 20为例 1 安装Ubuntu 20步骤 首先点击创建新的虚拟机 新建…

利用NAS免费部署动态解析实现内网穿透

‍ 想要从外网访问家中的NAS等设备&#xff0c;一般来说我们需要知道家中路由器的公网IP。 现在固定的公网IP基本上很难免费申请到了&#xff0c;但是一般来说运营商可以免费提供一个动态变化的公网IP&#xff1a;当路由设备重启时&#xff0c;运营商会给你重新分配一个新的I…

PHP加载3D模型【WebGL】

这是另一篇关于如何使用 PHP加载 3D 模型的文章。 在这里&#xff0c;我使用 Laravel 作为后端及其存储。 我在前端使用 Three.Js 库来渲染和显示 3D 模型。 我将向您展示如何上传 3D 模型以及如何从 Laravel 存储加载 3D 模型。 请仔细完成以下步骤。 大家可以在评论区提出任何…

8Manage PPM项目管理系统独特的功能:项目完整性保护

项目有其内在复杂性&#xff08;项目管理的科学部分&#xff09;&#xff0c;这种复杂性可以进行划分和克服。项目也有人为的或偶然的复杂性&#xff08;项目管理的艺术部分&#xff09;&#xff0c;这种复杂性无法进行划分和克服。偶然的高复杂性会影响并使内在复杂性难以管理…

【系统架构设计师】计算机组成与体系结构 ① ( 计算机组成 | CPU | 存储器 | 总线 | IO 外设 | CPU 组成 | 运算器 | 控制器 )

文章目录一、计算机组成与体系结构二、计算机组成结构三、CPU 组成1、运算器2、控制器一、计算机组成与体系结构 计算机组成与体系结构 对应 大学的 计算机组成原理 课程 , 主要分为 : 计算机组成体系结构划分 两大知识板块 ; 在架构师考试时 , 平均分值是 3 分 ; 计算机组成…

三相可控全桥整流与DC Buck变换电路设计仿真问题汇总

目 录 问题 一、开关管没有打开的情况下&#xff0c;DC Buck输出负电压&#xff1f; 二、问题分析 1.输出端存在与母线电压反相的电压&#xff0c;因此可以确定为差模感应电压&#xff0c;如果输出端与母线端产生的是大小相等&#xff0c;方向相同的同相电压&#xff0c;则为共…

大数据框架之Hadoop:HDFS(六)DataNode(面试开发重点)

6.1DataNode工作机制 DataNode工作机制&#xff0c;如下图所示。 1&#xff09;一个数据块在DataNode上以文件形式存储在磁盘上&#xff0c;包括两个文件&#xff0c;一个是数据本身&#xff0c;一个是元数据包括数据块的长度&#xff0c;块数据的校验和&#xff0c;以及时间戳…

ROS笔记(4)——发布者Publisher与订阅者Subscribe的编程实现

发布者 以小海龟的话题消息为例,编程实现发布者通过/turtle1/cmd_vel 话题向 turtlesim节点发送消息&#xff0c;流程如图 步骤一 创建功能包&#xff08;工作空间为~/catkin_ws/src&#xff09; $ cd ~/catkin_ws/src $ catkin_create_pkg learning_topic roscpp rospy s…

FLStudio水果最新版本V21支持中文语言

FL Studio简称FL&#xff0c;全称&#xff1a;Fruity Loops Studio习惯叫它水果。软件现有版本是FLStudio21&#xff0c;已全面升级支持简体中文语言界面 。FL Studio 能让你的计算机就像是全功能的录音室一样&#xff0c;完成编曲、剪辑、录音、混音等工作&#xff0c;帮助爱好…

2023大厂高频软件测试面试真题(附答案)

一、接口测试面试题&#xff1a;1.接口测试是怎么做的&#xff0c;如何分析数据&#xff1f;接口测试实际跟一般测试不同就是测试用例的设计部分。获取接口规范。设计接口测试功能用例&#xff08;主要从用户角度出发看接口能否实现业务需求&#xff0c;用例设计就是黑盒用例那…

2022财年净新增1159家门店,百胜中国门店高速扩张背后有何阳谋?

中国最大餐饮企业百胜中国控股有限公司&#xff08;下称“百胜中国”&#xff09;&#xff0c;2月8日发布了2022年度第四季度及全年未经审核的财务业绩。 从财报数据来看&#xff0c;这家拥有肯德基、必胜客、黄记煌等诸多餐饮品牌的巨头&#xff0c;已经顺利渡过了疫情笼罩下…

计算机网络(第7版)第五章(物理层)知识点整理

计算机网络 参考书目&#xff1a;《计算机网络&#xff08;第7版&#xff09;》&#xff1a;谢希仁——电子工业出版社 《精通Windows Sockets网络开发--基于Visual C实现》&#xff1a;孙海民——人民邮电出版社 第五章&#xff1a;物理层计算机网络一、基本概念二、传输媒体…

和数集团打造《神念无界:源起山海》,诠释链游领域创新与责任

首先&#xff0c;根据网上资料显示&#xff0c;一部《传奇》&#xff0c;二十年热血依旧。 《传奇》所缔造的成绩&#xff0c;承载的是多少人的青春回忆&#xff0c;《传奇》无疑已经在游戏史上写下了浓墨重彩的一笔。 相比《传奇》及背后的研发运营公司娱美德名声大噪&#x…

uniapp上高德(百度)地图API的使用(APP安卓)

前言由于在app中没有document,window等对象&#xff0c;所以使用在pc端传统方法引入的方式&#xff0c;将会发现无法引用成功&#xff0c;会出现白屏现象。目前有两种解决方式&#xff1a;使用uniapp的web-view方式&#xff08;百度地图&#xff09;使用renderjs来调用document…

【51媒体网】媒体邀约行业诞生及其前景预测

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。一&#xff0c;媒体邀约行业的诞生媒体邀约行业是随着现代社会媒体的普及而逐渐形成的。随着互联网和社交媒体的快速发展&#xff0c;媒体作为信息传播的重要渠道之一&#xff0c;越来越成…