vue3响应式对象:ref和reactive

ref()

<template><button @click="changeMsg">改变信息</button><div>{{ msg }}</div><div>{{ man }}</div>
</template><script lang="ts">
import { defineComponent,ref,Ref } from 'vue'export default defineComponent({setup() {let msg: Ref<string> = ref("你好")let man = ref({name:"wj"})const changeMsg = () => {msg.value = "我还好"console.log(msg);man.value.name = "hhhh"console.log(man);}return {msg,man,changeMsg}}
})
</script>

针对简单对象

针对复杂对象,但是内部的value被proxy代理了

isRef()

判断是不是一个ref对象

<template><button @click="handleClick">点击</button><div>{{ msg1 }}</div><div>{{ msg2 }}</div>
</template><script setup lang="ts">
import { ref,isRef } from 'vue'let msg1 = ref("我是msg1")
let msg2 = "我是msg2"const handleClick=()=>{console.log(isRef(msg1)); //trueconsole.log(isRef(msg2));	//false
}
</script><style scoped></style>

shallowRef()

浅层响应式。创建一个跟踪自身 .value 变化的 ref,但不会使其值也变成响应式的

<template><button @click="handleClick">点击</button><div>{{ man }}</div>
</template><script setup lang="ts">
import { ref,shallowRef } from 'vue'let man = shallowRef({name: "wj",code: {js:true}
})const handleClick=()=>{man.value.code.js = false;console.log(man);
}
</script>

shallowRef针对复杂对象,其value内部直接是值,不是一个proxy对象,无法做到深层响应

shallowRef不可以和ref同时使用,如果同时使用,shallowRef也会深层响应

<template><button @click="handleClick">点击</button><div>ref:{{ refMan }}</div><div>shallowRef:{{ man }}</div>  
</template><script setup lang="ts">
import { ref,shallowRef } from 'vue'let man = shallowRef({name: "wj",code: {js:false}
})let refMan = ref({name: "小米",code: {ts:false}
})const handleClick = () => {refMan.value.code.ts = trueman.value.code.js = true;console.log(refMan);console.log(man);
}
</script>

总结:

  1. ref 是深层次响应式,shallowRef 是浅层次响应式
  2. ref 和 shallowRef 不能写在一块,不然会影响shallowRef 造成视图更新

tiggerRef()

强制更新页面的DOM

<template><button @click="handleClick">点击</button>  <div>shallowRef:{{ man }}</div>  
</template><script setup lang="ts">
import { shallowRef,triggerRef } from 'vue'let man = shallowRef("我是shallowRef")const handleClick = () => {  man.value = "我是shallowRef,我被改变了";triggerRef(man)console.log(man);
}
</script>

customRef()

官网介绍:https://cn.vuejs.org/api/reactivity-advanced.html#customref

创建一个自定义的 ref,显式声明对其依赖追踪和更新触发的控制方式。

<template><button @click="handleClick">点击</button>  <div>customRef:{{ obj }}</div>  
</template><script setup lang="ts">
import { customRef } from 'vue'function myRef<T>(value:T) {return customRef((track, trigger)=> {return {get() {track()return value},set(newVal) {console.log("触发了");value = newValtrigger()}}})
}
let obj = myRef<string>("我是customRef")const handleClick = () => {  obj.value = "我是我是customRef,我被改变了";console.log(obj);
}
</script>

使用场景:可以自由控制响应式处理,比如在接口调用时候(官网示例)

import { customRef } from 'vue'export function useDebouncedRef(value, delay = 200) {let timeoutreturn customRef((track, trigger) => {return {get() {track()return value},set(newValue) {clearTimeout(timeout)timeout = setTimeout(() => {value = newValuetrigger()}, delay)}}})
}

reactive()

官网:https://cn.vuejs.org/guide/essentials/reactivity-fundamentals.html#reactive

1、reactive 限定了值类型,只能用于对象类型(Object、Array、集合(Map、Set))


<template><button @click="change">按钮</button><hr/><div>persion: {{ person }}</div>
</template><script setup lang="ts">
import { reactive } from 'vue'let person = reactive({name: "Tom",age: 23,gender:1
})const change = () => {person.name = "timi"console.log(person);
}</script>

2、不能替换整个对象:reactive是proxy对象,不能直接赋值,否则会破会其响应式

<template><button @click="noProxyChange">直接修改</button><hr/><div>list: {{ list }}</div>
</template><script setup lang="ts">
import { reactive } from 'vue'let list:string[] = reactive<string[]>([])const noProxyChange = () => {  let temp = ["1", "2", "3"]//替换了整个list对象list = tempconsole.log(list);  
}
</script>

解决方法:使用数组自带方法改变数组

<template>  <button @click="proxyChange">响应式修改</button>  <hr/><div>list: {{ list }}</div>
</template><script setup lang="ts">
import { reactive } from 'vue'let list:string[] = reactive<string[]>([])const proxyChange = () => {  list.push("1")list.push("2")list.push("3")console.log(list);  
}
</script><style scoped></style>

shallowReactive()

reactive() 的浅层作用形式

详情见文档:https://cn.vuejs.org/api/reactivity-advanced.html#shallowreactive

ref和reactive

  1. ref绑定对象类型时,通过源码知道也是调用的 reactive
  2. ref 取值和赋值都需要加 .value,reactive 不需要

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

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

相关文章

Android 13.0 根据包名授权悬浮窗权限

1.概述 在13.0的系统产品开发中,在一些特殊权限比如悬浮窗,WRITE_SETTINGS权限,安装权限等等这些特殊权限,是需要单独授权的,在申请动态权限是不起作用的,所以 就需要根据包名用AppOpsManager.java中的方法来授权,来实现授权悬浮窗权限的功能. 2.根据包名授予悬浮窗权…

【SEC 学习】美化 Linux 终端

一、步骤 1. 进入 /etc/bash.bashrc vim /etc/bash.bashrc2. 重新加载 bash.bashrc source /etc/bash.bashrc二、各参数指标 符号含义\u当前用户的账号名称\h仅取主机的第一个名字&#xff0c;如上例&#xff0c;则为fc4&#xff0c;.linux则被省略\H完整的主机名称。例如&…

服务器感染了.secret勒索病毒,如何确保数据文件完整恢复?

导言&#xff1a; .secret勒索病毒已经成为网络安全界的一大噩梦。这种病毒会将您宝贵的数据文件加密&#xff0c;然后以高额赎金作为条件来释放它们。在这篇文章中&#xff0c;我们将深入研究.secret勒索病毒的特点&#xff0c;讨论如何解密被锁定的数据文件&#xff0c;并提…

C++STL---Vector、List所要掌握的基本知识

绪论​ 拼着一切代价&#xff0c;奔你的前程。 ——巴尔扎克&#xff1b;本章主要围绕vector和list的使用&#xff0c;以及容器底层迭代器失效问题&#xff0c;同时会有对原码的分析和模拟实现其底层类函数。​​​​话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑…

SQL中使用ROLLUP和CUBE函数轻松生成汇总行

在数据分析和报表制作中&#xff0c;通常需要对数据进行汇总和分组&#xff0c;我们常用的就是GROUP BY汇总数据&#xff0c;当我们想按照不同维度汇总时&#xff0c;往往需要编写多个GROUP BY预计&#xff0c;而借助ROLLUP 和 CUBE 函数可以一次性生成子总计和总计行&#xff…

Mac电脑配置Dart编程环境

1.安装Dart SDK 官网地址&#xff1a;https://dart.dev/get-dart $brew tap dart-lang/dart$brew install dart 安装后&#xff0c;用命令检测一下是否安装正常。 $brew info dart 2.VS Code配置Dart环境 1).安装VS Code 官网地址&#xff1a;https://code.visualstudio.c…

Python环境下LaTeX数学公式转图像方案调研与探讨

目录 引言方案一&#xff1a;基于LaTeX环境方案二&#xff1a;基于KaTeX(推荐) 方案三&#xff1a;基于Matplotlib写在最后 引言 近来&#xff0c;涉及到一些公式识别的项目&#xff0c;输入是公式的图像&#xff0c;输出是LaTeX格式的数学公式字符串。 这类项目一般都采用深…

【SEC 学习】Vim 的基本使用

一、Vim 编辑器安装 yum install -y vim二、Vim 三种模式 命令模式 编辑模式 末行模式 三、三种模式之间的转换 1. 命令模式 -> 编辑模式 快捷键含义i从光标处插入I从光标所在行首插入a从光标后插入A从光标所在行末插入o从光标下一行插入O从光标上一行插入 2. 命令模式 …

pgsql 分组查询,每组取10条

需求&#xff1a; 按照表的字段分组&#xff0c;然后每组取10条结果&#xff0c;返回即可 sql 如下&#xff1a; SELECT* FROM (SELECT chk_id,feature_id,task_id, ROW_NUMBER () OVER (PARTITION BY chk_id ORDER BY chk_id) AS row_num FROM ics_check_report WHERE task…

Ubuntu 23.10(Mantic Minotaur)正式发布,支持Linux 6.5和GNOME 45

导读Canonical 近日正式发布了 Ubuntu 23.10&#xff08;Mantic Minotaur&#xff09;操作系统&#xff0c;其中包含一些最新的 GNU/Linux 技术、改进的硬件支持以及许多其他变化。 Ubuntu 23.10 采用了最新的 Linux 6.5 内核系列&#xff0c;并为 Ubuntu 桌面和服务器增强了 z…

Qt5 Python-docx库的使用,Qt python混合编程,qt 读写word,不依赖office

解决方案的选择 参考&#xff1a; https://www.jianshu.com/p/be68884849c3 因为项目要求不能使用模板方案&#xff0c;不能依赖Office&#xff0c;网上找了一些解决方案进行调研&#xff0c;以下几个方案&#xff1a; OpenOffice: 兼容性差&#xff0c;集成调用难度大LibOffi…

从字节码层面分析Lambda

invokedynamic 指令 动态类型语言和静态类型语言的区别&#xff1a; ● 它俩的区别在于对类型的检查是在编译器还是在运行期&#xff0c;满足前者就是静态类型语言&#xff0c;反之是动态类型语言。 ● 静态类型语言是判断变量自身的类型信息&#xff1b;动态类型语言是判断变…

【顺序栈的出栈,链栈的表示和实现,递归定义】

文章目录 顺序栈的出栈 链栈的表示和实现链表的初始化判断链栈是否为空链栈的入栈链栈的出栈 递归定义函数的调用过程 顺序栈的出栈 &#xff08;1&#xff09;判断是否栈空&#xff0c;若空则出错&#xff08;下溢&#xff09;。 &#xff08;2&#xff09;获取栈顶元素e。 &…

【AD9361 数字接口CMOS LVDSSPI】B 并行数据之CMOS 续

续【AD9361 数字接口CMOS &LVDS&SPI】B 并行数据之CMOS 数据总线空闲和周转周期 &#xff08;CMOS&#xff09; P0_D[11&#xff1a;0]和P1_D[11&#xff1a;0]总线信号通常由BBP或AD9361有源驱动。在任何空闲期间&#xff0c;两个组件都会忽略数据总线值。但是&…

MODBUS-RTU从站通信(SMART PLC作为MODBUS-RTU从站)

SMART PLC作为MODBUS-RTU主站通信请参考下面文章链接: 【精选】PLC MODBUS通信优化、提高通信效率避免权限冲突(程序+算法描述)-CSDN博客文章浏览阅读2.5k次,点赞5次,收藏10次。MODBUS通讯非常简单、应用也非常广泛,有些老生常谈的问题,这里不再赘述,感兴趣的可以参看…

uci机器学习数据库简介

UCI&#xff08;University of California, Irvine&#xff09;机器学习数据库是经过精心整理的、用于研究和开发机器学习算法的数据集合。UCI机器学习数据库是一个公开的、广泛使用的数据集合&#xff0c;它由加州大学欧文分校的计算机科学系维护。该数据库中包含了许多数据集…

Python中的变量与注释

一、变量与注释决定第一印象 1、变量和注释是代码里最接近自然语言的部分&#xff0c;其可读性至关重要。 2、即便是同一个算法&#xff0c;变量和注释的不同&#xff0c;也会给人截然不同的印象。 二、基础知识 1、Python变量赋值语法非常灵活&#xff01; &#xff08;1&…

基于 ARM+FPGA+AD平台的多类型同步信号采集仪开发及试验验证(一)上位机设计

采集仪上位机设计 本章开发了一款基于 C# 的上位机软件&#xff0c;用于对多类型同步信号采集仪的各项功能 进行操作。从采集仪的数据传输需求出发&#xff0c;上位机利用以太网 UDP 协议实现与采集仪 的数据交互&#xff0c;包括向采集仪发送控制信息与配置信息、接收采…

Vite+Vue3项目全局引入scss文件

前言 Sass 是世界上最成熟、最稳定、最强大的专业级CSS扩展语言&#xff01;在日常项目开发过程中使用非常广泛&#xff0c;今天主要讲一下 ViteVue3 项目中该如何全局引入 scss 文件&#xff0c;引入混合 mixin 文件的不同配置。捎带说一下 Vue2 中的引入方式做一下简单的对比…

【linux】安装rpmrebuild

rpmrebuild是一种从已经安装的包中构建RPM文件的工具。它可以用于轻松构建修改后的包&#xff0c;并适用于任何使用RPM的Linux发行版。 访问地址 rpm rebuild download | SourceForge.net 选择版本 版本地址&#xff1a;版本地址 下载安装包 安装 rpm -ivh rpmrebuild-2.15…