vueJs函数toRaw markRaw使用对比详解

作者:itclanCoder 时间:2024-04-09 10:46:23 

前言

针对一些特殊的需求,在项目里,需要将响应式数据变为普通原始类型数据,这种情况是有的

Vue里,能够将普通数据类型的数据变为响应式数据,同时,也能将响应式类型数据变为普通类型数据

可以用于提升数据的性能

toRaw()函数

接收一个reactive响应式数据,将一个响应式的数据变为普通类型的数据,转化为非响应式数据,相当于还原对象,reactive相当于制作,但对于ref响应式数据不起作用

将一个由reactive生成的响应式对象转为普通(原始)对象

toRaw()可以返回由reactive(),readonly(),shallowReactive()shallowReadonly()创建的代理对应的原始对象

这是一个可以用临时读取而不引起代理访问/跟踪开销,或是写入而不触发更改的特殊方法,在官方文档里,是不建议保存对原始对象的持久引用

使用场景:用于读取响应式对象的普通对象,对这个普通对象的所有操作,不会引起页面的更新

const foo = {}
const reactiveFoo = reactive(foo)
console.log(toRaw(reactiveFoo) === foo)  // true

注意

针对对象,后续动态新增的属性,如果没有把整个对象对外暴露出去,模板中使用新增的变量是不生效的(针对setup函数形式)

markRaw()函数

接收一个原始数据,标记一个对象,使它永远不会再成为响应式对象,也就是数据在逻辑中即使修改变化了,但是页面不会更新变化

将一个对象标记为不可被转为代理,返回该对象本身

应用场景:

[1]. 有些值不应该被设置为响应式的,例如复杂的第三方类库或Vue组件对象

[2]. 当渲染具有不可变数据源的大列表时,跳过响应式转换可以提高性能

const foo = markRaw({})
console.log(isReactive(reactive(foo))) // false
// 也适用于嵌套在其他响应性对象
const bar = reactive({ foo })
console.log(isReactive(bar.foo)) // false

markRaw()shallowReactive()这样浅层式API使你可以有选择的避开默认的深度响应/只读转换,并在状态关系谱中嵌入原始,非代理的对象

如果把一个嵌套的,没有标记的原始对象设置成一个响应式对象,然后再次访问它,你获取到的是代理的版本,这可能会导致对象身份风险

即执行一个依赖于对象身份的操作,但却同时使用了同一对象的原始版本和代理版本

const foo = markRaw({
 nested: {}
})
const bar = reactive({
 // 尽管 `foo` 被标记为了原始对象,但 foo.nested 却没有
 nested: foo.nested
})
console.log(foo.nested === bar.nested) // false

来源:https://juejin.cn/post/7215736946253594684

标签:vueJs,函数,toRaw,markRaw
0
投稿

猜你喜欢

  • Vue3中setup方法的用法详解

    2023-07-02 16:56:19
  • python中的 sorted()函数和sort()方法区别

    2022-04-13 05:16:11
  • 浅析Banner构成与创意设计

    2009-11-28 16:25:00
  • Python字符转换

    2021-08-23 04:47:13
  • Python干货实战之八音符酱小游戏全过程详解

    2021-08-20 11:21:27
  • 推荐个辅助软件FastStone Capture

    2008-12-23 13:23:00
  • 轻松搞定IE的CSS制作网页技巧3则

    2009-08-14 20:32:00
  • Python3列表List入门知识附实例

    2023-03-12 06:41:22
  • Python matplotlib 动画绘制详情

    2022-04-12 14:36:52
  • Javascript vue.js表格分页,ajax异步加载数据

    2024-05-21 10:13:05
  • SQLServer2000 报1053错误(服务没有及时响应或控制请求)的解决方法

    2024-01-23 10:40:47
  • Python求导数的方法

    2023-11-22 07:51:15
  • MySQL变量原理及应用实例

    2024-01-12 17:35:30
  • python实现朴素贝叶斯分类器

    2022-12-05 03:35:50
  • python中jieba模块的深入了解

    2023-01-25 05:08:47
  • nodejs使用socket5进行代理请求的实现

    2024-05-09 14:49:44
  • python抓取某汽车网数据解析html存入excel示例

    2023-11-02 16:46:35
  • Python爬虫beautifulsoup4常用的解析方法总结

    2022-09-01 11:58:54
  • MAC下Anaconda+Pyspark安装配置详细步骤

    2021-02-11 18:15:51
  • sql server如何利用开窗函数over()进行分组统计

    2024-01-16 01:55:36
  • asp之家 网络编程 m.aspxhome.com