首页 > 其他分享 >【Vue3】readonly和shallowReadonly

【Vue3】readonly和shallowReadonly

时间:2024-04-01 14:32:38浏览次数:18  
标签:count shallowReadonly 只读 ++ state readonly Vue3

readonly()​

接受一个对象 (不论是响应式还是普通的) 或是一个 ref,返回一个原值的只读代理。

类型

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

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

要避免深层级的转换行为,使用 shallowReadonly() 作替代。

示例

const original = reactive({ count: 0 })

const copy = readonly(original)

watchEffect(() => {
  // 用来做响应性追踪
  console.log(copy.count)
})

// 更改源属性会触发其依赖的侦听器
original.count++

// 更改该只读副本将会失败,并会得到一个警告
copy.count++ // warning!

shallowReadonly()​

readonly() 的浅层作用形式

类型

function shallowReadonly<T extends object>(target: T): Readonly<T>

和 readonly() 不同,这里没有深层级的转换:只有根层级的属性变为了只读。属性的值都会被原样存储和暴露,这也意味着值为 ref 的属性不会被自动解包了。

浅层数据结构应该只用于组件中的根级状态。请避免将其嵌套在深层次的响应式对象中,因为它创建的树具有不一致的响应行为,这可能很难理解和调试。

示例

const state = shallowReadonly({
  foo: 1,
  nested: {
    bar: 2
  }
})

// 更改状态自身的属性会失败
state.foo++

// ...但可以更改下层嵌套对象
isReadonly(state.nested) // false

// 这是可以通过的
state.nested.bar++

标签:count,shallowReadonly,只读,++,state,readonly,Vue3
From: https://blog.csdn.net/owo_ovo/article/details/137084220

相关文章

  • 【Vue3】toRaw和markRow
    toRaw作用用于获取一个响应式对象的原始对象,toRaw返回的对象不再是响应式的,不会触发视图更新。toRaw()可以返回由reactive()、readonly()、shallowReactive()或者shallowReadonly()创建的代理对应的原始对象。注意:这是一个可以用于临时读取而不引起代理访问/跟踪开......
  • 【前端面试3+1】07vue2和vue3的区别、vue3响应原理及为什么使用proxy、vue的生命周期
    一、vue2和vue3的区别1.性能优化:        Vue3在性能方面有很大的提升,主要是通过虚拟DOM的优化和响应式系统的改进实现的。虚拟DOM重构:Vue3中对虚拟DOM进行了重构,使得更新算法更加高效,减少了更新时的开销,提升了性能。静态树提升:Vue3可以通过静态树提升技术......
  • vue3 点击按钮跳转到对应的tab页面
     大家好呀,我又来记录一下啦实现功能:点击”查看“按钮,跳转到对应的tab页面方法:router按钮部分:<el-buttonsize="small"@click="check(scope.row.name)">查看</el-button>对应的方法:check(){this.$router.push({path:'/about'})},router:import......
  • Vite + Vue3 项目的创建 ,启动 ,停止
    第一步:使用命令行创建工程在磁盘的合适位置上,创建一个空目录用于存储多个前端项目用vscode打开该目录在vocode中打开命令行运行如下命令npmcreatevite@latest第一次使用vite时会提示下载vite,输入y回车即可,下次使用vite就不会出现了注意:选择vue+JavaScript选项即可......
  • 前后端问题整理 持续更新 附赠Vite+Vue3+Ts项目配置
    问题整理(Vite,Vue(1-3)|.NET)持续更新目录问题整理(Vite,Vue(1-3)|.NET)持续更新前端@项目配置1.node版本过高问题安装nvm管理node版本2.镜像证书无效问题3.npm版本问题4.npminstall证书过期问题5.yarn命令无法使用问题6.ViteVue项目搭建npmrundev错误nod......
  • 通过Vite创建Vue3项目
    目录一、下载安装node.js18版本及以上,通过node-v来查看node版本二、换淘宝镜像2.1更换镜像2.2查看镜像是否安装成功:npmconfiggetregistry三、全局安装vite: npminstall-gvite@latest 四、创建项目五、查看是否成功一、下载安装node.js18版本及以上,通过......
  • Vue3+Vite+Axios Request 请求封装(TS版本)最新
    Vue3+Vite+AxiosRequest请求封装(TS版本)http>index.ts请求封装/**@Date:2024-03-3012:37:05*@LastEditors:zhong*@LastEditTime:2024-03-3014:12:52*@FilePath:\app-admin\src\http\index.ts*/importaxios,{AxiosInstance,AxiosRequestCon......
  • vue3+threejs新手从零开发卡牌游戏(二十二):添加己方游戏流程(先后手、抽牌、主要阶段、战
    首先在utils/common.ts里定义一些流程相关的变量:constflow=ref([//游戏流程{name:"抽卡阶段"},{name:"主要阶段"},{name:"战斗阶段"},{name:"结束阶段"}])constflowIndex=ref(......
  • vue3动态加载组件
    Vue2项目中使用require.context()来动态地加载模块。但是Vue3项目默认使用ES模块,而不是CommonJS模块。因此,你不能直接使用require()来加载模块。在Vue3项目中,你可以使用import.meta.glob()或import.meta.globEager()来实现类似的功能。以下是一个例子,如何使用import.meta.gl......
  • vue3批量将图片添加水印并导出压缩包
    vue3批量将图片添加水印并导出压缩包<scriptsetuplang="ts">import{ref,onMounted}from'vue'importJSZipfrom'jszip'constimg_list=ref([{img:'https://img.keaitupian.cn/uploads/2020/07/20/zv2owzexj5i.jpg'},......