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,一经查实,立即删除!

相关文章

【SEC 学习】美化 Linux 终端

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

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

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

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格式的数学公式字符串。 这类项目一般都采用深…

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…

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

文章目录 顺序栈的出栈 链栈的表示和实现链表的初始化判断链栈是否为空链栈的入栈链栈的出栈 递归定义函数的调用过程 顺序栈的出栈 &#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通讯非常简单、应用也非常广泛,有些老生常谈的问题,这里不再赘述,感兴趣的可以参看…

基于 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…

人工智能轨道交通行业周刊-第64期(2023.10.16-10.29)

本期关键词&#xff1a;北斗应用、供电智能运维、5G-R、铁路职称、星火大模型 1 整理涉及公众号名单 1.1 行业类 RT轨道交通人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通RailMetro轨道世界铁路那…

【计算机网络】认识协议

目录 一、应用层二、协议三、序列化和反序列化 一、应用层 之前的socket编程&#xff0c;都是在通过系统调用层面&#xff0c;如今我们来向上打通计算机网络。认识应用层的协议和序列化与反序列化 我们程序员写的一个个解决我们实际问题, 满足我们日常需求的网络程序, 都是在应…

如何快速解决d3dcompiler_43.dll缺失问题?五种方法快速解决

在计算机使用过程中&#xff0c;我们常常会遇到一些错误提示&#xff0c;其中之一就是“D3DCompiler_43.dll缺失”。这个错误通常会导致游戏、应用程序或系统无法正常运行。为了解决这个问题&#xff0c;我们需要采取一些修复方案来恢复缺失的文件。本文将介绍五个修复D3DCompi…

百度超级链XuperChain使用JavaSDK接入

环境 &#xff1a; ubuntu20 xuperchain 5.3 go 1.17 springboot : 2.5.14 前言 请提前启动好xchain的节点&#xff0c;我选择简单启一个xchain节点作为测试&#xff0c;并且使用默认端口37101 SpringBoot项目初始化 我们先进行SpringBoot项目的配置进行讲解&#xff0c;这里…

Flutter的The file name ‘xxxx.dart‘ isn‘t a snake_case identifier警告

文章目录 警告原因分析解决方法dart的一些命名规则变量和函数命名&#xff1a;类和类型命名&#xff1a;常量和枚举&#xff1a;文件命名&#xff1a;包命名&#xff1a;注释&#xff1a;命名一致性&#xff1a;避免缩写&#xff1a;可搜索的命名&#xff1a; 一些好习惯 警告 …

[已解决]安装的明明是pytorch-gpu,但是condalist却显示cpu版本,而且torch.cuda.is_available 也是flase

问题; 安装了gpu版本的pytorch&#xff0c;但是显示的torch.cuda.is_available(&#xff09;却是flase。 conda list查看 版本显示只有cpuonly 在网上找了半天&#xff0c;也没有解决办法。 仔细看了一下&#xff0c;发现&#xff0c;有个单独的包叫cpuonly&#xff0c;不知道…

33基于MATLAB的对RGB图像实现中值滤波,均值滤波,维纳滤波。程序已通过调试,可直接运行。

基于MATLAB的对RGB图像实现中值滤波&#xff0c;均值滤波&#xff0c;维纳滤波。程序已通过调试&#xff0c;可直接运行。 33 MATLAB、图像处理、维纳滤波 (xiaohongshu.com)