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

vue3 响应式 API:readonly() 与 shallowReadonly()

readonly()

readonly()是一个用于创建只读代理对象的函数。它接受一个对象 (不论是响应式还是普通的) 或是一个 ref,返回一个原值的只读代理。

类型

function readonly<T extends object>(target: T
): DeepReadonly<UnwrapNestedRefs<T>>

以下是对这个函数签名的详细解释:

  • 参数target: T
    • target是要被转换为只读对象的输入对象。
    • T extends object表示类型参数T必须是一个对象类型,这确保了输入的target只能是对象而不是基本数据类型(如数字、字符串等)。
  • 返回值DeepReadonly<UnwrapNestedRefs<T>>:这个函数返回一个深度只读的、解包了嵌套响应式对象的新对象。
    • DeepReadonly是一个工具类型,它使传入的类型变为深度只读类型,即对象的所有嵌套属性也都是只读的。
    • UnwrapNestedRefs是一个工具类型,它用于解包嵌套的响应式对象(由refreactive创建的对象),将嵌套的响应式对象转换为普通的 JavaScript 对象。

示例

readonly()创建的只读代理是深层的:对任何嵌套属性的访问都将是只读的。它的 ref 解包行为与 reactive() 相同,但解包得到的值是只读的。

  • 对象的所有嵌套属性都将变为只读。
  • 任何尝试修改这个对象的操作都会被阻止(在开发模式下,还会在控制台中发出警告)。
import { readonly } from 'vue';
let readonlyObj = readonly({message: 'hello',info: {name: 'readonly',back: 'Proxy对象'}
})// 报错:无法为“message”赋值,因为它是只读属性。
readonlyObj.message = 'hello'
// 无法为“name”赋值,因为它是只读属性。
readonlyObj.info.name = 'readonly!'


如果原始对象是响应式的,那么通过readonly创建的对象也会保持响应性:原始对象的属性发生变化,只读对象也会反映这些变化。

import { reactive, readonly } from 'vue';let reactiveObj = reactive({message: 'hello'
})let readonlyObj = readonly(reactiveObj)
console.log(reactiveObj, readonlyObj)// 修改原始对象reactiveObj
reactiveObj.message = 'hello, world!'
console.log(reactiveObj, readonlyObj)

查看控制台打印结果:
在这里插入图片描述
只读对象readonlyObj跟随原始对象reactiveObj的变化而变化。

应用场景

  • 创建不可变的状态快照。
  • 保护全局状态或配置不被修改。


shallowReadonly()

shallowReadonly()readonly() 的浅层作用形式,是一个用于创建浅层只读代理对象的函数。

shallowReadonly接受一个对象作为参数,并返回一个新的代理对象。
shallowReadonly创建的对象是浅层只读的:

  • 只将对象的顶层属性设置为只读,对象内部的嵌套属性可以被修改。
  • 适用于只需保护对象顶层属性的场景。
import { reactive, shallowReadonly } from 'vue';let readonlyObj = shallowReadonly({message: 'hello',info: {name: 'readonly',back: 'Proxy对象'}
})// 无法为“message”赋值,因为它是只读属性。
readonlyObj.message = 'hello, world!'
// name是嵌套属性,不是readonlyObj的第一层属性,因此,name可以被修改
readonlyObj.info.name = 'readonly!!!'

如果原始对象是响应式的,那么通过shallowReadonly创建的对象也会保持响应性。

http://www.lryc.cn/news/434354.html

相关文章:

  • 迁移学习与知识蒸馏对比
  • 【Java-反射】
  • 移动UI设计要求越来越高,最为设计师应如何迎头赶上
  • 大数据-121 - Flink Time Watermark 详解 附带示例详解
  • 国行 iPhone 15 Pro 开启苹果 Apple Intelligence 教程
  • conda、anaconda、pip、torch、pytorch、tensorflow到底是什么东西?(转载自本人的知乎回答)
  • 数据库系列之GaussDB数据库中逻辑对象关系简析
  • 如何进行不同数据库的集群操作?--从部署谈起,今天来看MySQL和NoSql数据库Redis的集群
  • 第 6 章图像聚类
  • HC-SR501人体红外传感器详解(STM32)
  • 关于武汉芯景科技有限公司的IIC电平转换芯片XJ9517开发指南(兼容PCF9517)
  • C语言:scanf()、getchar()、gets()
  • 基于MATLAB的全景图像拼接系统实现
  • AI模型“减肥”风潮:量化究竟带来了什么?
  • 第四届“长城杯”网络安全大赛 暨京津冀网络安全技能竞赛(初赛) 全方向 题解WriteUp
  • ETCD的备份和恢复
  • Linux Makefile文本处理函数知识详解
  • Rust的数据类型
  • 如何在vim中批量注释和取消注释
  • Centos7.9 安装Elasticsearch 8.15.1(图文教程)
  • 哈希表-数据结构
  • 指针之旅(4)—— 指针与函数:函数指针、转移表、回调函数
  • 打造线上+线下相结合的O2O平台预约上门服务小程序源码系统 带完整的安装代码包以及搭建部署教程
  • python sys模块
  • 【Linux 报错】SSH服务器拒绝了密码。请再试一次。(xshell)
  • 云计算实训43——部署k8s基础环境、配置内核模块、基本组件安装
  • TAbleau 可视化 干货分享 | 简单三步助你打造完美仪表板
  • JVM性能调优之5种垃圾收集器
  • 基于单片机的仔猪喂饲系统设计
  • Helm Deploy Online Rancher v2.9.1