vue3 响应式对象的 api 详解

news2025/7/7 10:42:04

在这里插入图片描述

文章目录

      • Ⅰ. ref、reactive ( 递归监听 )
      • Ⅱ. isRef、isReactive ( 判断 )
      • Ⅲ. toRef 和 toRefs ( 解构 )
      • Ⅳ. toRaw 、 markRaw ( 解除代理)
      • Ⅴ. unref ( 拷贝 )
      • Ⅵ. shallowRef 、shallowReactive( 非递归监听 )
      • Ⅶ. triggerRef (强制更新)

Ⅰ. ref、reactive ( 递归监听 )

import {ref,reactive} from 'vue';
setup() {
    const num =  ref(123);
    num.value = 456;
     
    const obj = reactive({num:123});
    obj.value = 456;
}
  • ref 对象 在 html 模板中会 自动添加 value ( ref 对象中__v_isRef:true 进行判断的 )
  • ref 对象 => reactive( { value:0 } ) 底层自动转换为 reactive
  • 最终 基本数据 类型采用 => (Object.defineProperty) ,引用数据 类型采用 => ( proxy 代理 )

Ⅱ. isRef、isReactive ( 判断 )

import {isRef,isReactive} from 'vue';
setup() {
	const num = ref(123)
    console.log(isRef(num))  // => true
}
  • 用于判断是否是 Ref 和 Reactive 创建的响应对象
  • 使用场景较少

Ⅲ. toRef 和 toRefs ( 解构 )

toRef (一个属性)

import { toRef , reactive } from 'vue';
setup() {
	const obj = reactive({ width:10, height:20 })
    const width = toRef(obj,'width')
	
	return {
		width
	}
}
  • 将一个响应对象的属性,当作 响应对象 单独拿出来 。

toRefs ( 所有 )

import { toRefs , reactive } from 'vue';
setup() {
	const obj = reactive({ width:10, height:20 })
    const { width, height }= toRefs(obj)
	
	return {
		width, height
	}
}
  • 将多个或所有属性,拿出来 且还是响应对象,
  • 一般在返回的时候一次性全部导出 👇
import { toRefs , reactive } from 'vue';
setup() {
	const obj = reactive({ width:10, height:20 })
	
	return {
		...toRefs(obj)
	}
}

Ⅳ. toRaw 、 markRaw ( 解除代理)

toRaw ( 不影响本身 )

import {toRaw} from 'vue';
setup(){
    const num1 =  ref(123)
    const num2 = toRaw(num1)
    console.log(num2 === 123)  //=>true
}
  • 不影响原数据 ,相当于拷贝当前的值
  • 拷贝的值,不在是响应式对象

markRaw ( 添加 非响应对象 属性 )

import { markRaw, reactive } from "vue";
setup(){
	const obj = reactive({ num:1 }); //让数据无法被追踪
	      obj.noUpdate = markRaw({num:1});

	function add() {
  		obj.num++;      // 页面数据 会更新
  	
  		obj.noUpdate.num++; //页面数据 不会更新
	}
	return { obj , add }
}
  • 通过 markRaw 添加的值 => 其中的属性变化,页面不会监听的到
  • 用于添加搞定的参数,不会发生不会的 ( 从而节约资源 )

Ⅴ. unref ( 拷贝 )

const aaa = ref('abc');
const bbb = unref(aaa); 
  • 相当于 bbb = isRef(aaa) ? aaa.value : aaa 的语法糖
  • 可以用于拷贝

Ⅵ. shallowRef 、shallowReactive( 非递归监听 )

shallowRef 、shallowReactive(非递归监听)

import {shallowRef,shallowReactive} from 'vue';
setup(){
	const  obj1 = shallowRef({a:1,b:{c:2})
	const  obj2 = shallowReactive({a:1,b:{c:2})

	obj1.value.a = 2  //页面未更新

	obj2.b.c = 3  //页面未更新
}
  • obj1 (shallowRef)=> 只监听第一层( value 的值,不监听a、b、c、d 的值)
  • obj2 (shallowReactive)=> 只监听第一层( a、b 的值,不监听 c 的值)

Ⅶ. triggerRef (强制更新)

import {triggerRef, shallowRef} from 'vue';
setup(){
	const  obj1 = shallowRef({a:1,b:{c:2})
    obj1.value.a = 2 //页面没有发生更新,因为只监听value第一层

	triggerRef(obj1);   // 强制更新
  • 非递归监听,只监听首层 ,消耗的资源小;
  • 配合 triggerRef 强制更新 => 性能要大于 > 直接使用 (ref 和 reactive)

在这里插入图片描述

🚐 💨 华为社招直通车 👉 👉 华为od面试流程
🚀🚀🚀
总结不易,希望uu们不要吝啬你们的👍哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正😁

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

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

相关文章

使用小程序制作一个老照片修复工具,让追忆时光触手可及

一、文章前言二、准备流程三、开发步骤四、完整代码一、文章前言 此文主要通过小程序来制作一个照片修复工具,实现黑白图片上色及图像效果增强等功能。 二、准备流程 2.1、注册百度开放平台及微信公众平台账号。 2.2、下载及安装微信Web开发者工具。 2.3、如需通过SDK调用及需…

LVGL V8应用——通过按键切换页面

一、按键切换对象 程序 全局变量 static lv_obj_t *contanier1 NULL; static lv_obj_t *contanier2 NULL;按钮对应回调函数,实现容器的切换 static void win_btn_event_callback1(lv_event_t* e) {lv_event_code_t code lv_event_get_code(e);if (code LV_EVE…

猿创征文|前端到全栈,一名 IT 初学者的学习与成长之路

目录导读写在前面创作之路❤ 前端开发工程师知识体系❤ Vue&React 开发框架❤ 前端开发实战❤ Linux&云原生小马技术栈❤ 主打技术专栏❤ 其他专栏(实用干货)❤ 技术栈词云学习与成长总结写在前面 2021 年 7 月 18 日我在 CSDN 发布了第一篇技术文章,距现在…

如何用html制作一个简单的网页

哈喽,大家好!我是小张。大家在浏览网页的时候有没有好奇过这个网页是怎么制作,其实只是制作一个简单的网页是很简单的。今天我就教一下大家如何用HTML制作一个简单的网页。 了解html 1. 学习html之前先要知道html是什么 HTML的全称为超文本标…

查看Chrome浏览器版本及下载对应的webdriver,并下载安装

查看Chrome浏览器版本及下载对应的webdriver,并下载 文章目录查看Chrome浏览器版本及下载对应的webdriver,并下载一,查看自己电脑的Chrome的版本二,webdriver的对应版本三,安装一,查看自己电脑的Chrome的版…

nvm介绍、安装、报错处理以及使用

前言 工作中我们偶尔可能同时在进行多个项目开发,而多个不同的项目所使用的 node 版本又是不一样的,在这种情况下,对于维护多个版本的node 将会是一件非常麻烦的事情,因为需要操作做卸载安装操作,而nvm 就是为解决这个…

关于Vue3的defineProps用法

之前只是单纯的会用,因为vue关于父子组件通讯差别有一点点大。 1.在父组件内传递变量的时候,需要加冒号:,否则你就只是单纯的传递了一个字符串而已。 2.在子组件里不需要引入defineProps就可调用该函数去接收父组件传来的属性。 我个人在这里…

axios基本使用及跨域问题详解

前端请求自然也发展迅速,从原生的XHR到jquery ajax,再到现在的axios和fetch。axios( https://axios-http.com/zh/ )是Vue推荐的http库,这个还是要了解一点的。 安装 $ npm install axios基本使用的例子 1、在main.j…

Vue项目:学生管理系统

💂 个人主页: 陶然同学🤟 版权: 本文由【陶然同学】原创、在CSDN首发、需要转载请联系博主💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦💅 想寻找共同成长的小伙伴,请点击【Java全栈开发社区】…

Nginx的安装配置教程

一、Nginx的下载与安装 Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好 1.下载 在Nginx的官网的下载页面…

JavaScript-匿名函数

什么是匿名函数 1、匿名函数,即没有名称的函数 2、如果单独只写一个匿名函数,此时是不符合语法要求的 会报错。需要给 匿名函数包裹一个括号,使之成为表达式。 3、被小括号包裹的内容会被js识别为一个函数表达式 如何执行和使用匿名函数? …

前端直传阿里云OSS

阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务。 目前通过Web端直传文件(Object)到OSS,有两种方案: 一、利用OSS…

web渗透之文件上传漏洞

目录一、原理二、利用方式三、文件上传的风险处四、文件上传漏洞的危害五、文件上传漏洞常见的绕过方式1、前端绕过检测2、mime类型检测绕过3、黑名单绕过(1)、相似扩展名(2)、apache配置文件(3)、大小写绕…

如何将html模板资源转为vuecli项目

1.目标 将找到的html素材模板,转换为vue的文件。 这个网上照了一圈,没找到合适的方案,就自己尝试弄了一下 目标效果 2.具体步骤 1. 通过vueclie 创建项目 vue create 项目名称然后把默认的样式删除了 2. 将静态资源放到vue项目的 publi…

【python】自动填写问卷星问卷及提交

前言:问卷是很好的网络调查方式之一,近年来,问卷星被广泛应用于各方面的调查。本文介绍了利用python代码自动填写问卷星基本题目,拥有自动填写、解决智能验证、批量提交问卷等功能。 目录 1.下载浏览器驱动 2. selenium基本配置…

【Java 基础篇】Java 初识、编译运行机制及开发环境搭建

一、Java 语言初识二、Java 编译运行机制2.1 JVM、JRE、JDK 三大概念介绍2.2 Java 是如何运行的三、Java 开发环境搭建(文末附下载地址)四、第一个 Java 项目4.1 创建项目和 .Java 源文件4.2 输出 hello world一、Java 语言初识 Java 是由 Sun Microsystems 公司于 1995 年 5 …

十大经典排序算法(下)

🍓个人主页:bit.. 🍒系列专栏:Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 HTML和CSS3 目录 1.6 快速排序 1. 算法步骤 2. 动图演示 3.代码实现 1.7 堆排序 1. 算法步骤 2. 动图演示 3. 代码实现 1.8 计数排…

JavaScript注册监听事件与清除监听事件

JavaScript中有两种方法可以注册监听事件,一种是传统的注册方式,on事件名称的注册方法,如btn.onclick,还有方法监听事件注册方式, addEventListener()和ie8以下的attachEvent()。 注册监听事件 传统方式 语法格式:元…

ES6笔记————let,箭头函数,剩余参数

目录 一.let,var,const区别 let const 区别 二,解构 1 数组解构 2对象解构 三,箭头函数 1 基础语法 2 省略写法 3 对象方法里的this 4 apply/call调用时的this 5 箭头函数中this 8 箭头函数应用 四,剩余函数 一.let,var,con…

【bug】Failed at the node-sass@4.14.1 postinstall script(终于圆满解决)

花了两个小时才解决 首先是从git上克隆项目到本地,然后安装nodele_modules,输入npm i安装 安装到一半报错 npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! node-sass4.14.1 postinstall: node scripts/build.js npm ERR! Exit status 1 npm ERR! …