shallowReadonly 和 readonly

2024-08-24 20:28
文章标签 readonly shallowreadonly

本文主要是介绍shallowReadonly 和 readonly,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在 Vue 3 中,shallowReadonlyreadonly 都是用于创建只读响应式对象的 API。这两者的主要区别在于它们的“深度”处理方式

readonly

创建一个深层次的只读响应式对象,所有嵌套的属性都会变成只读的,且会被递归地转换为只读响应式对象。这意味着你不能直接修改这个对象或它的任何嵌套属性的值,如果尝试修改会在开发环境下抛出警告。

import { reactive, readonly } from 'vue';const state = reactive({user: {name: 'Alice',age: 25}
});const readonlyState = readonly(state);// 访问属性
console.log(readonlyState.user.name); // 输出: Alice// 尝试修改顶层属性(失败)
readonlyState.user = { name: 'Bob', age: 30 }; // 警告: 修改失败// 尝试修改嵌套属性(失败)
readonlyState.user.name = 'Bob'; // 警告: 修改失败

在这个示例中,readonlyState 是一个通过 readonly 创建的深层次只读对象。你不能修改 readonlyState 的任何属性,包括嵌套属性。

shallowReadonly

shallowReadonly 创建一个浅层次的只读响应对象,用于将一个对象的顶层属性设为只读,而不会递归地处理嵌套属性。嵌套的属性仍然是可变的

import { shallowReadonly } from 'vue';const state = {user: {name: 'Alice',age: 25}
};const shallowReadonlyState = shallowReadonly(state);// 访问属性
console.log(shallowReadonlyState.user.name); // 输出: Alice// 尝试修改顶层属性(失败)
shallowReadonlyState.user = { name: 'Bob', age: 30 }; // 警告: 修改失败// 尝试修改嵌套属性(成功)
shallowReadonlyState.user.name = 'Bob'; // 成功修改

在这个示例中,shallowReadonlyState 是一个通过 shallowReadonly 创建的浅层次只读对象。顶层属性 user 是只读的,不能被重新赋值,但是嵌套属性 user.name 仍然是可变的,可以被修改。

总结

  1. readonly:深层次的只读,递归地将对象及其所有嵌套属性设为只读。
  2. shallowReadonly:浅层次的只读,只将对象的顶层属性设为只读,嵌套属性仍然可变。
  3. 适用场景:
    • readonly:适用于你希望整个对象及其所有嵌套属性都不被修改的场景。常用于防止深层数据结构中的任何属性被意外修改。例如:全局配置对象不允许修改、vuex中 state 的不允许直接修改(但是可以在vuex中修改)、接口返回数据不允许修改
    • shallowReadonly:适用于你只希望保护对象的顶层属性不被修改,而允许嵌套属性仍然可以修改的场景。常用于需要限制对象的结构不变,但允许部分数据动态变化的场景。例如:组件 Props 本身不应被替换,但子对象中的某些属性可以在组件内部进行修改。保护对象的外层结构不被修改,同时允许内部的嵌套对象根据业务需求进行动态修改。

这篇关于shallowReadonly 和 readonly的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1103512

相关文章

Selenium 调用 JavaScript 操作带有 readonly 属性 的日期控件

'''<input class="index_start" readonly="" placeholder="开始日期" size="12" autocomplete="off" type="text" value=""><input class="index_end" readonly="" placeholder="结束日期" size="12" autocomplete="off" ty

redis被攻击redis READONLY You can‘t write against a read only slave.

redis 日志路径 /var/log/redis 拿下来后发现有这种错误 Operation now in progress 可能是网络断开导致, 查找redis whereis redis 修改 vim /etc/redis.conf 大概在300行 下面代码yes改no slave-read-only no 重启redis sudo systemctl restart

spring事务在readonly上的一个疏忽还是一个bug

问题描述: http://www.iteye.com/topic/319768 经过测试加上源代码,发现, 如果你使用的是DataSourceTransactionManager来管理事务,readonly是不起作用的:(HibernateTransactionManager是起作用的,后面有源码分析) Xml代码   <bean id="transactionMa

@property atomic与nonatomic readonly

@property与@synthesize是成对出现的,可以自动生成某个类成员变量的存取方法。在xcode4.5以及以后的版本,@synthesize可以省略。 1.atomic与nonatomic atomic :默认是有该属性的,这个属性是为了保证程序在多线程情况,编译器会自动生成一些互斥加锁代码,避免该变量的读写不同步问题。 nonatomic :如果该对象无需考虑多线程的情况

iOS attempt to write a readonly database

db文件保存的路径为本地路径 如: [[NSBundle mainBundle] pathForResource:@"myDatabase" ofType:@"db"]; 会出现此数据库文件为只读属性 造成此数据库文件不可修改 如果一定要到这种文件的话就把这个文件copy到本程序沙盒

TypeScript高级类型 在鸿蒙中的使用 Partial、Required、Readonly、Pick、Record

我的工程代码在这里,持续更新中 欢迎交流,谢谢 https://github.com/MartinLi89/WanHarmony Partial <Type> 新定义 一个类型,将所有属性变为可选的类. class TextTS {a: string = "1"b: string = "2"c: string = "3"}//1 Partial <Type>新定义 一个类型,将所有属性变为

General error: 8 attempt to write a readonly database

今天遇到一个权限问题: General error: 8 attempt to write a readonly database 后来才发现我的storage目录权限为root如下: 接下来修改目录权限为www权限: chown -R www:www storage/ 修改成功!!!

c#:值类型、引用类型、装箱和拆箱、结构体、readonly、ref

环境: window10vs2019.net core 3.1 控制台 参考: 《C#中定义装箱和拆箱详解》 《c# struct 灵魂拷问》 《[译]C# 7系列,Part 6: Read-only structs 只读结构》 《[译]C# 7系列,Part 9: ref structs ref结构》 《.NET高性能编程 - C#如何安全、高效地玩转任何种类的内存之Span的本质(一)。

Typescript高级: 深入理解const和readonly

概述 在编程语言中,const 和 readonly 是两种用于声明常量或只读属性的关键字它们帮助开发者确保数据的不可变性,从而提高代码的安全性和可维护性虽然这两个概念在不同的编程语言中可能有所差异但本文将以 TypeScript 为例,深入探讨 const 和 readonly 的使用场景 const 关键字 在 TypeScript(以及JavaScript ES6之后的版本)中cons

html input readonly 和 disable的区别

html input readonly 和 disable的区别      Readonly和Disabled它们都能够做到使用户不能够更改表单域中的内容。但是它们之间有着微小的差别,总结如下:      Readonly只针对input(text / password)和textarea有效,而disabled对于所有的表单元素都有效,但是表单元素在使用了disabled后,当我们将表单