快速了解toRaw和markRaw的用法

news2024/12/25 19:08:22

toRaw

toRaw,将响应式对象(由 reactive定义的响应式)转换为普通对象。

  • 作用:将一个由reactive生成的响应式对象转为普通对象
  • 使用场景:用于读取响应式对象对应的普通对象,对这个普通对象的所有操作,不会引起页面更新。

toRaw示例一

​ 在代码中我们声明了一个对象 然后将对象传入reactive方法 返回一个响应式的对象 随后我们将person 响应式的对象 通过toRaw方法变回了普通对象 随后为了验证 变会的普通的对象 是不是我们最开始定义的对象 我们进行了一次输出

<template>
  <div>
    <h1>姓名:{{ p.name }}</h1>
    <h2>年龄:{{ p.age }}</h2>
    <h3>喜欢的水果:{{ p.likeFood.fruits.apple }}</h3>
    <button @click="p.name += '~'">修改姓名</button>
    <button @click="p.age++">修改年龄</button>
    <button @click="p.likeFood.fruits.apple += ''">修改水果</button>
  </div>
</template>
 
<script>
import { reactive, toRaw } from "vue";
export default {
  name: "App",
  setup() {
    // 定义了一段数据
    let data = {
      name: "张三",
      age: 18,
      likeFood: {
        fruits: {
          apple: "苹果",
        },
      },
    }
    // 将普通对象变为响应对象
    let person = reactive(data);
    // 将响应对象变为普通对象
    let p = toRaw(person)
 
    // 打印 data 是否等于 p 
    console.log(p === data);    // true
    // 将数据返回出去
    return {
      p
    };
  },
};
</script>

在浏览器中我们可以看到 打印信息为真 点击修改按钮 修改数据后页面也不做出响应了

img

toRaw示例二

  • main.js

import { createApp } from 'vue'
import App from './App.vue'

createApp(App).mount('#app')
  • App.vue
<template>
  <Demo/>
</template>
<script>
    import Demo from './components/Demo.vue'
    export default {
      name: 'App',
      components: {
        Demo
      }
    }
</script>
  • Demo.vue
<template>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <h2>薪酬:{{person.job.salary}}K</h2>
  <button @click="person.age++">增长年龄</button>&nbsp;
  <button @click="person.job.salary++">涨薪</button>&nbsp;
  <button @click="showRawPerson">点我显示原始person</button>
</template>
<script>
import {reactive, toRaw} from "vue";
export default {
      name:"Demo",
      setup(){
        let person = reactive({
          name:"张三",
          age:25,
          job:{
            salary:30
          }
        })
    function showRawPerson(){
      console.log("person=",person);
      let p = toRaw(person);
      console.log("raw person = ",p);
    }

    return {
      person,
      showRawPerson
    }
  }
}
</script>
  • 启动应用,测试效果
    person,是由reactive定义的响应式对象。
    toRaw(person)后,响应式对象person就变成了一个普通对象。如下图所示。

img

markRaw

markRaw,标记一个对象,使其不能成为一个响应式对象。

我们在代码中声明了一个响应式对象 我们现在对象上添加一属性而这个属性的值被修改之后不需要页面的更新

我们知道直接在一个响应式的对象上添加属性也会被处理为响应式的,所以我们通过了markRaw()方法先将对象处理为一个永远不会再成为响应式对象 在添加在p对象上

markRaw示例一

<template>
  <div>
    <h1>姓名:{{ p.name }}</h1>
    <h2>年龄:{{ p.age }}</h2>
    <h3>喜欢的水果:{{ p.likeFood.fruits.apple }}</h3>
    <button @click="p.name += '~'">修改姓名</button>
    <button @click="p.age++">修改年龄</button>
    <button @click="p.likeFood.fruits.apple += ''">修改水果</button>
  </div>
</template>
 
<script>
import { reactive, markRaw } from "vue";
export default {
  name: "App",
  setup() {
    // 定义了一段数据
    let p = reactive({
      name: "张三",
      age: 18,
    });
    // 在p对象上直接添加一个对象会处理为响应式的 所一使用markRaw()使其永远不会再成为响应式对象。
    p.likeFood = markRaw({
      fruits: {
        apple: "苹果",
      },
    });
 
    // 将数据返回出去
    return {
      p,
    };
  },
};
</script>
 
 

我们在修改这个对象上的属性时页面就不会在触发更新了

img

markRaw示例二

  • main.js
import { createApp } from 'vue'
import App from './App.vue'

createApp(App).mount('#app')
  • App.vue
<template>
  <Demo/>
</template>
<script>
import Demo from './components/Demo.vue'
export default {
  name: 'App',
  components: {
    Demo
  }
}
</script>
  • Demo.vue
<template>
  <h2>姓名:{{person.name}}</h2>
  <h2>年龄:{{person.age}}</h2>
  <div v-if="person.otherInfo" style="background:skyblue;margin-bottom:10px">
    <h4>岗位:{{person.otherInfo.position}}</h4>
    <h4>薪酬:{{person.otherInfo.salary}}K</h4>
    <button @click="changePosition">调整岗位</button>&nbsp;
    <button @click="changeSalary">增加薪酬</button>
  </div>
  <button @click="addOtherInfo">增加其他信息</button>
</template>
<script>
import {reactive,markRaw} from "vue";
export default {
  name:"Demo",
  setup(){
    let person = reactive({
      name:"张三",
      age:25
    })
    function addOtherInfo(){
      person.otherInfo = markRaw({
        position:"前端工程师",
        salary:30
      })
    }

    function changePosition(){
      person.otherInfo.position = "后端工程师";
    }

    function changeSalary(){
      person.otherInfo.salary++;
    }

    return {
      person,
      addOtherInfo,
      changePosition,
      changeSalary
    }
  }
}
</script>
  • 启动应用,测试效果
    通过person.otherInfo的方式,给响应式对象person新增了属性otherInfo
    otherInfo属性值是一个由markRaw包裹的对象,即markRaw({ position:"前端工程师", salary:30 })
    markRaw{ position:"前端工程师", salary:30 }变成了一个非响应式对象。因此,当修改person.otherInfo.positionperson.otherInfo.salary时,界面不会更新。如下图所示。

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/531265.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mongo基本操作---文档的增删改查

4、CRUD mongo数据库和平时常见的关系型数据库一样&#xff0c;最基本的操作就是增删改查&#xff0c;唯一的区别就是叫法不一样 SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域…

韦东山Linux驱动入门实验班(1)hello驱动

前言 &#xff08;1&#xff09;学习韦东山老师的Linux&#xff0c;因为他讲的很精简&#xff0c;以至于很多人听不懂。接下来我讲介绍韦东山老师的驱动实验班的第一个Hello程序。 &#xff08;2&#xff09;注意&#xff0c;请先学习完视频再来看这个教程&#xff01;本文仅供…

AD9680+JESD204B接口+FPGA FMC高速率数据采集板卡

板卡概述&#xff1a; 【FMC_XM155】 FMC_XM155 是一款基于 VITA57.1 标准的&#xff0c;实现 2 路 14-bit、500MSPS/1GSPS/1.25GSPS 直流耦合 ADC 同步采集 FMC 子卡模 块。 该模块遵循 VITA57.1 规范&#xff0c;可直接与 FPGA 载卡配合使用&#xff0c;板 卡 ADC 器件采用…

CIE颜色空间LCh、Lab、XYZ介绍与转换关系(包含源码)

项目场景&#xff1a; 提示&#xff1a;在颜色科学中&#xff0c;LCh和Lab是比较常用的 LCh是由MATLAB计算出的数据&#xff0c;但是我所需要在Qt的q3dsurface绘制出这个切面&#xff0c;看了Qt官方Examples&#xff0c;墨西哥草帽算法的3D模型就是由XYZ组成的。所以我需要LC…

【c语言】组件化打包—静态库

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

MacOS使用Parallels Desktop安装win11虚拟机

文章目录 前话一、安装Parallels Desktop二、安装Windows11虚拟机1.win11镜像下载2.虚拟机启动 三、创建过程问题解决1.安装win11系统的时候不显示网路2.系统安装完成后无法连接网络 三、参考文献 前话 为了让大家能快速获取到需要的内容&#xff0c;这里提前说明一下本文适用…

杂记——23.java中的值传递和应用传递

这篇文章我们来讲一下java中的值传递和引用传递 结论&#xff1a;java中只存在值传递&#xff0c;不存在引用传递&#xff08;C中有引用传递&#xff09; 分析&#xff1a; 值传递(pass by value)&#xff1a;在调用函数时&#xff0c;将实际参数复制一份传递到函数中&#…

用DevExpress WinForms富文本编辑器,集成高级文本编辑功能(二)

DevExpress WinForm富文本编辑器&#xff08;RTF编辑器&#xff09;控件允许用户将高级文本编辑功能集成到下一个WinForms项目中&#xff0c;它包括全面的文本格式选项、支持邮件合并&#xff0c;并附带了丰富的终端用户选项集&#xff0c;因此可以轻松交付受Microsoft word启发…

助力工业物联网,工业大数据之数仓维度层DWS层构建【十二】

文章目录 数仓维度层DWS层构建01&#xff1a;项目回顾02&#xff1a;项目目标03&#xff1a;维度建模回顾&#xff1a;建模流程04&#xff1a;维度建模回顾&#xff1a;维度设计05&#xff1a;维度建模回顾&#xff1a;维度模型 数仓维度层DWS层构建 01&#xff1a;项目回顾 O…

《现代中学生》期刊简介及投稿要求

《现代中学生》期刊简介及投稿要求 《现代中学生》 主管单位&#xff1a;吉林省教育厅 主办单位&#xff1a; 吉林教育杂志社 国际刊号ISSN&#xff1a;1009-5748&#xff1b;国内刊号CN&#xff1a;22-1046/G4&#xff1b;邮发代号&#xff1a;12-52 出版周期&#xff1a…

刷题day65:整数拆分

题意描述&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。. 思路&#xff1a; 首先dp[i]代表将i拆分&#xff0c;并得到的最大乘积&#xf…

springboot+jsp高校招生宣传系统java校园网站

学校招生管理系统的用户是系统最根本使用者&#xff0c;按需要分析系统包括两类用户&#xff1a;学生、管理员。这两类用户对系统的功能简要如下。 管理员通过后台的登录页面&#xff0c;选择管理员权限后进行登录&#xff0c;管理员的权限包括招生计划管理、招生录取信息管理和…

知识变现海哥:我们不生产知识,我们只是知识的搬运工!

现在大家都在谈知识付费&#xff0c;而且有一些东西就是书本上有的&#xff0c;但被录制成视频&#xff01;加上专业的讲师去讲&#xff0c;配上PPT文档&#xff0c;然后发布出去&#xff0c;标上一定的价格后&#xff0c;就会有人去付费购买学习。 想想是不是很暴利&#xff1…

如何使用ArcGIS生成随机数

&#xff08;本文首发于“水经注GIS”公号&#xff0c;关注公号免费领取地图数据&#xff09; 在制图的过程中&#xff0c;制作某些效果需要根据字段的随机数来生成对应的颜色&#xff0c;所以需要操作字段生成随机数&#xff0c;这里为大家介绍一下ArcGIS生成随机数的方法&…

对话金现代|轻骑兵低代码开发平台,破局企业“数字化焦虑

当今世界正经历百年未有之大变局&#xff0c;大数据、云计算、区块链、人工智能等新技术飞速发展&#xff0c;越来越多的企业经营者&#xff0c;开始投入到数字化转型的浪潮中&#xff0c;期望通过数字化帮助企业实现业务增长&#xff0c;开启无限可能。但随着时间的推移&#…

基于平台视角下的数据交易模式及特点分析

基于平台视角下的数据交易模式及特点分析 陈宏民1, 熊红林1, 胥莉1&#xff0c;杨云鹏1, 卓训方2 1 上海交通大学安泰经济与管理学院&#xff0c;上海 200030 2 上海数据交易所有限公司&#xff0c;上海 201203 摘要&#xff1a;基于国内外数据交易市场的发展现状与平台思维视角…

用GDB调试cmake编译后的C++程序

文章目录 编译时添加参数用GDB运行程序参考 编译时添加参数 cmake -DCMAKE_BUILD_TYPEDebug <path and other arguments>用GDB运行程序 开始调试 start设置断点&#xff0c;这样会在运行到源码第6行时停止&#xff0c;可以查看变量的值、堆栈情况等&#xff1b;这个行…

71.建立一个轮播图组件第二部分

这节课我们通过绝对定位的方式来实现上一届未实现的内容&#xff01; ● 首先我们先设置一下button和图标 /* CONTROLS */.btn {background-color: #fff;border: none;height: 40px;width: 40px;}.btn-icon {height: 24px;width: 24px;}● 接着我们来设置绝对定位 .carousel {p…

如何在 FPGA 中做数学运算

FPGA 非常适合进行数学运算&#xff0c;但是需要一点技巧&#xff0c;所以我们今天就看看如何在 FPGA 中进行简单和复杂的数学运算。 介绍 由于FPGA可以对算法进行并行化&#xff0c;所以FPGA 非常适合在可编程逻辑中实现数学运算。我们可以在 FPGA 中使用数学来实现信号处理、…

Java进阶-面向对象进阶(static和继承)

1 复习回顾 1.1 如何定义类 类的定义格式如下: 修饰符 class 类名 {// 1.成员变量&#xff08;属性&#xff09;// 2.成员方法 (行为) // 3.构造方法 &#xff08;初始化类的对象数据的&#xff09; }例如: public class Student {// 1.成员变量public String name ;public…