【vue3笔记之 ref 和 reactive 】

实现响应式数据的方法

可以使用 ref,reactive定义响应式数据,本质上就是将传入的数据包装成一个Proxy对象。
使用 reactive 必须是对象(Json/arr),如果给 reactive 传递了其他的对象,默认情况下修改对象,页面不会自动更新。但是可以通过重新赋值的形式更新页面。

<template><div><p>{{value.time}}</p><button @click="myFn">按钮</button></div>
</template>
import {reactive} from 'vue';
setup() {let value = reactive({time: new Date()});// 实现点击按钮,当前日期的天数加一funtion myFn() {const newValue = new Date(value.time.getTime());newValue.setDate(value.time.getDate() + 1);value.time = newValue;}return {value, myFn};
}

ref 实现对简单值的监听,本质其实还是 reactive,系统会自动根据我们给 ref 的传值将它装换成ref(xx) >>>> reactive({value: xx})
注意:
vue中<template>使用 ref 的值不用通过value获取,但在<script><template>中需要通过 .value 去获取 ref 定义的值;(注:Vue是根据当前数据中是否含有私有属性 __v_ref 为true来判断是不是ref类型,从而判断是否需要添加 .value。在代码中有 isRef 和 isReactive 方法去判断当前数据是什么类型的)
JS中使用ref的值必须通过value获取。

<template><div><p>{{age}}</p><button @click="myFn">按钮</button></div>
</template>
import {isRef, isReactive} from 'vue';
import {ref} from 'vue';
setup() {let age = ref(18);funtion myFn() {console.log(isRef(age)); // 结果为trueconsole.log(isReactive(age)); // 结果为falseage.value = 666;}return {age, myFn};
}

递归监听

1、默认情况下,ref 和 reactive 都是递归监听
2、递归监听的弊端:如果数据量比较大,非常消耗性能(Vue3会递归取出对象每一层的值,把每层的值都包装成一个proxy对象)

非递归监听

1、只能够监听第一层,不能监听其他层
2、使用 shallowRef 和 shallowReactive方法定义非递归,shallowReactive定义的非递归对象只会给第一层包装成proxy,只要第一层数据发生变化,其他层级的也会重新渲染。第一层没有变化的话,其他层级也不会发生变化。shallowRef 定义的数据,那么vue监听的是 .value的变化,并不是第一层的变化,因为本质上shallowRef的第一层是value。triggerRef根据传入的数据,主动的更新界面。(Vue3只提供了triggerRef方法,没有triggerReactive方法,如果是reactive定义的 数据,是没有办法触发界面更新的)

递归/非递归的应用场景

一般情况下,我们使用 ref 和 reactive 递归监听即可
只有需要监听的数据量非常大的时候,才使用非递归监听 shallowRef 和 shallowReactive

扩展:toRaw() 方法专门用来获取 ref 或者 reactive 类型的原始数据,如果是获取 ref 类型的原始数据,需要在对象后面添加 .value。
获取原始数据的作用:由于 ref 和 reactive 数据类型每次修改都会被追踪并更新UI界面(消耗性能),如果有些操作不需要监听 和更新UI界面,可以先使用toRaw获取原始数据,对原始数据进行修改。

【Vue3】李南江老师讲解--个人笔记(二)ref 和 reactive详解相关推荐

  1. 【Vue3】李南江老师讲解--个人笔记(一)

    太喜欢李南江老师了,自带二倍速还可以讲的明明白白,又拥有一个有趣的灵魂~i了i了 [vue3笔记] vue2和vue3的区别: 1.vue2使用Object.defineProperty方法实现响应式 ...

  2. C++语法学习笔记二十九: 详解decltype含义,decltype主要用途

    实例代码 // 详解decltype含义,decltype主要用途#include <iostream> #include <functional> #include < ...

  3. Linux 网络编程学习笔记——二、IP 协议详解

    目录 一.IP 服务的特点 IP 协议为上层协议提供无状态.无连接.不可靠的服务: 无状态(stateless):指 IP 通信双方不同步传输数据的状态信息,因此所有 IP 数据报的发送.传输和接收都 ...

  4. 论vue3.0和vue2.0区别之编程方式及例子详解

    系列文章目录 第一章 论vue3.0和vue2.0区别之编程方式及例子详解 第二章 同一台电脑 实现 vue-cli2和vue-cli3同时并存 及 常见命令 第三章 vue3.0项目实战 - Ele ...

  5. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  6. Java8初体验(二)Stream语法详解(转)

    本文转自http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 上篇文章Java8初体验( ...

  7. 2接口详解_TS入门笔记2——TS接口进阶详解

    TS入门笔记--TS接口进阶详解 一.为什么需要接口? let obj:object; // 定义了一个只能保存对象的变量 // obj = 1; // obj = "123"; ...

  8. 信号与系统考研复习例题详解_小语种日语日本文学复习考研资料加藤周一《日本文学史序说(上)》笔记和考研真题详解...

    加藤周一<日本文学史序说(上)>笔记和考研真题详解 目录 序章 日本文学的特征 0.1 复习笔记 第一章 <万叶集>的时代 1.1 复习笔记 1.2 考研真题与典型题详解 第二 ...

  9. IP地址和子网划分学习笔记之《IP地址详解》

    在学习IP地址和子网划分前,必须对进制计数有一定了解,尤其是二进制和十进制之间的相互转换,对于我们掌握IP地址和子网的划分非常有帮助,可参看如下目录详文. IP地址和子网划分学习笔记相关篇章: 1.I ...

最新文章

  1. flink批处理访问mysql_Flink 异步IO访问外部数据(mysql篇)
  2. sicily 1150. 简单魔板
  3. 学习Nutch不错的系列文章
  4. RocketMQ有哪些消息类型?springboot如何整合rocketMQ
  5. linux c 运行脚本,linux 将c源代码当作shell一样脚本运行_沃航科技
  6. 永不改变的PCB设计黄金法则
  7. JS JQ 页面加载顺序方法的区别
  8. Effective Java 思维导图
  9. 制作字幕.html教程,怎样制作视频字幕
  10. 软件过程模型的管道理论
  11. Orcle中Database Control - orcl打开错误或者打不开的解决办法
  12. Mac mini 2018+ 进入 Recovery 预置恢复模式方法
  13. Map嵌套Map遍历
  14. scratch双语教师课件文档手册 2.scratch模块介绍
  15. 一顿操作猛如虎,一看还是二百五
  16. 音乐处理原理第一章:音乐表示
  17. Windows下4K屏mobaxterm远程桌面设置
  18. 如何选择一款好相机?
  19. PS给照片添加镜头梦幻光斑动态图片效果
  20. 社会热点----清华pk北大

热门文章

  1. H5实现win10日历效果
  2. AUTOCAD绘制3D家具有感
  3. SQLMAP进阶使用 --tamper
  4. mac上通过自动操作达到右键通过vscode打开文件、文件夹
  5. three.js贴图之CubeTextureLoader全景贴图
  6. 【课程复习】Java Web、框架及项目简单回顾
  7. mfc opengl 三维地形图_深圳pmax巨影三维扫描仪
  8. 用数字暗示我喜欢你_我喜欢数字!
  9. LeetCode热题100中使用辅助栈方法的题目的整理(待更)
  10. 使用js修改图片像素颜色并保存