当前位置:   article > 正文

vue3中toRaw 与 markRaw

markraw

· toRaw

返回由 reactive 或 readonly 方法转换成响应式代理的普通对象。

这是一个还原方法,可用于临时读取,访问不会被代理/跟踪,写入时也不会触发界面更新。

· markRaw

标记一个对象,使其永远不会转换为代理。返回对象本身

应用场景:

有些值不应被设置为响应式的,例如复杂的第三方类实例或 Vue 组件对象。

当渲染具有不可变数据源的大列表时,跳过代理转换可以提高性能。

toRaw:

  1. <template>
  2. <div style="font-size: 14px">
  3. <h2>{{ state.name }}</h2>
  4. <h2>{{ state.age }}</h2>
  5. <hr />
  6. <button @click="update">更新</button>
  7. <button @click="testToRaw">测试toRaw更新</button>
  8. </div>
  9. </template>
  10. <script lang="ts">
  11. import { defineComponent, reactive, toRaw } from "vue";
  12. // vue3.0版本语法
  13. export default defineComponent({
  14. setup() {
  15. const state = reactive({
  16. name: "张三",
  17. age: 25,
  18. });
  19. const update = () => {
  20. state.name += "--"; // 界面更新
  21. };
  22. const testToRaw = () => {
  23. // 临时读取得到代理对象代理的目标数据对象
  24. const user = toRaw(state);
  25. user.name += "++"; // 更新数据 》界面也不会更新
  26. console.log(state.name);
  27. // 可用于需要对原始数据对象进行处理: 比如深拷贝
  28. };
  29. return {
  30. state,
  31. update,
  32. testToRaw,
  33. };
  34. },
  35. });
  36. </script>

点击更新按钮后的页面:

点击测试toRaw更新按钮后的页面:

更新数据 》界面也不会更新

markRaw:

  1. <template>
  2. <div style="font-size: 14px">
  3. <p>{{state2.products}}</p>
  4. </div>
  5. </template>
  6. <script lang="ts">
  7. /*
  8. markRaw:
  9. 标记一个对象,使其永远不会转换为代理。返回对象本身
  10. 应用场景:
  11. 有些值不应被设置为响应式的,例如复杂的第三方类实例或 Vue 组件对象。
  12. 当渲染具有不可变数据源的大列表时,跳过代理转换可以提高性能。
  13. */
  14. import {
  15. reactive,
  16. markRaw,
  17. isReactive,
  18. } from 'vue'
  19. export default {
  20. setup () {
  21. const state = markRaw({a: 1, b: {c: 'abc'}})
  22. console.log(state)
  23. console.log(isReactive(reactive(state))) // false
  24. const state2 = reactive({
  25. products: new Array<any>()
  26. })
  27. setTimeout(() => {
  28. // 得到所有商品列表显示
  29. let ps = ['p1', 'p2', 'p3', 'p4']
  30. /*
  31. 对数组进行标记为原始数组对象 ==> 后面即使生成对应的proxy对象后, 更新内部数据也不会更新界面
  32. 如果明确数组后面不会再更新了, 就可以使用markRaw处理, 提交运行效率
  33. */
  34. ps = markRaw(ps)
  35. // 响应式数据可以更新
  36. state2.products = ps
  37. // 再想修改markRaw标记后的数据-并不是响应式了》不能修改界面
  38. setTimeout(() => {
  39. state2.products[0] += '--'
  40. }, 2000)
  41. }, 3000)
  42. return {
  43. state2
  44. }
  45. }
  46. }
  47. </script>

初始页面数据:

3秒后页面数据:

再过2秒后页面没有更新:

再想修改markRaw标记后的数据-并不是响应式了》不能更新界面

setTimeout(() => {

state2.products[0] += '--'

}, 2000)

欢迎关注我的原创文章:小伙伴们!我是一名热衷于前端开发的作者,致力于分享我的知识和经验,帮助其他学习前端的小伙伴们。在我的文章中,你将会找到大量关于前端开发的精彩内容。

学习前端技术是现代互联网时代中非常重要的一项技能。无论你是想成为一名专业的前端工程师,还是仅仅对前端开发感兴趣,我的文章将能为你提供宝贵的指导和知识。

在我的文章中,你将会学到如何使用HTML、CSS和JavaScript创建精美的网页。我将深入讲解每个语言的基础知识,并提供一些实用技巧和最佳实践。无论你是初学者还是有一定经验的开发者,我的文章都能够满足你的学习需求。

此外,我还会分享一些关于前端开发的最新动态和行业趋势。互联网技术在不断发展,新的框架和工具层出不穷。通过我的文章,你将会了解到最新的前端技术趋势,并了解如何应对这些变化。

我深知学习前端不易,因此我将尽力以简洁明了的方式解释复杂的概念,并提供一些易于理解的实例和案例。我希望我的文章能够帮助你更快地理解前端开发,并提升你的技能。

如果你想了解更多关于前端开发的内容,不妨关注我的原创文章。我会不定期更新,为你带来最新的前端技术和知识。感谢你的关注和支持,我们一起探讨交流技术共同进步,期待与你一同探索前端开发的奇妙世界!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号