对于vue3ref和reactive的学习笔记

devtools/2024/9/25 10:32:39/

1. 对于ref的学习

ref

接受一个内部值并返回一个响应式且可变的 ref 对象。通过这个对象的value属性去操作数据

案例:

<script setup lang="ts">
import { ref } from 'vue'
const message = ref("数据")
function change():void {message.value = "改变了一次"
}
</script><template><button @click="change">点我一下</button><div>{{message}}</div></template><style scoped></style>
isRef

用来判断一个对象是否为ref对象

案例: 从vue引入isRef再通过isRef进行判断即可

shallowRef

是一个浅层次的响应式,也就是它只能检测到vuale的变化,不能检测到value下的属性的变化

注意,不可以和ref对象的值写在一起,否则也会触发更新

案例:

<script setup lang="ts">
import { ref,isRef,shallowRef,Ref } from 'vue'
const message:Ref<string> = ref("数据")
const shallowMes:Ref<object> = shallowRef({name:"jjs"})
function change():void {message.value = "改变了一次"console.log(isRef(message))
}
setTimeout(()=> {shallowMes.value.name = "1231"
},1000)
</script><template><button @click="change">点我一下</button>
<!--  <div>{{message}}</div>--><div>{{shallowMes}}</div>
</template><style scoped></style>
triggerRef

强制更新页面dom,也就是手动刷新视图,ref对象会自动帮我们去调这个api

<script setup lang="ts">
import { shallowRef,Ref,triggerRef } from 'vue'
const shallowMes:Ref<object> = shallowRef({name:"jjs"})
function change():void {}
setTimeout(()=> {shallowMes.value.name = "1231"triggerRef(shallowMes)
},1000)
</script><template><button @click="change">点我一下</button><div>{{shallowMes}}</div>
</template><style scoped></style>
customRef

customRef 是个工厂函数要求我们返回一个对象 并且实现 get 和 set  适合去做防抖之类的

我们可以自定义ref

<script setup lang="ts">
import { Ref,customRef } from 'vue'
function myRef<T> (value:T):Ref {let time:any = nullreturn customRef((track, trigger)=> {return {get() {// 收集依赖track()return value},set(newVal) {clearTimeout(time)time = setTimeout(()=> {console.log("修改")// 触发更新trigger()value = newVal},500)}}})
}
let customData = myRef<string>("我是自定义的")function change():void {customData.value = "我变化了"
}
</script><template><button @click="change">点我一下</button><div>{{customData}}</div>
</template><style scoped></style>

2. 对于reactive的学习

用来绑定复杂的数据类型 例如 对象 数组

不能够绑定基本数据类型

基本用法示例:

使用reactive无需.value只用.属性即可

<script setup lang="ts">
import { reactive } from 'vue'
const reactiveData = reactive({name: 'jjs'})function change():void {reactiveData.name = 'jtt'
}
</script><template><button @click="change">点我一下</button><div>{{reactiveData}}</div></template><style scoped></style>
readonly

拷贝一份对象为仅读,但是原reactive的修改也会引起他的变化

案例

<script setup lang="ts">
import { reactive,readonly } from 'vue'
const reactiveData = reactive({name: 'jjs'})
const reactiveCopy = readonly(reactiveData)
function change():void {reactiveData.name = 'jtt'console.log(reactiveCopy.name)
}
</script><template><button @click="change">点我一下</button><div>{{reactiveData}}</div></template><style scoped></style>
shallowReactive

也是只能对浅层次的数据做一个响应式,只能相应到obj.xxx如果xxx属性是一个对象的话,就没有响应式了,但是它也和shallowRef一样,如果reactive一起使用的话,也会收到reactive的影响导致视图进行更新,更新的为最新数据

toRef

将reactive的一个属性转换成ref类型,如果原始对象是非响应式的就不会更新视图 数据是会变的

如果原始对象是响应式的是会更新视图并且改变数据的

toRefs

可以帮我们批量创建ref对象主要是方便我们解构使用

结构如: let {name,age} = {...obj}

toRaw

将响应式对象转化为普通对象

案例:

<script setup lang="ts">
import { reactive,toRef,toRefs,toRaw } from 'vue'
const reactiveData = reactive({name: 'jjs',age: 13})
let {name,age} = toRefs(reactiveData)
const nameRef = toRef(reactiveData,'name')
const dataRaw = toRaw(reactiveData)
function change():void {name.value = 'jtt'age.value = 18console.log(dataRaw)
}
</script><template><button @click="change">点我一下</button><div>{{reactiveData}}</div><div>{{name}}----{{age}}</div><div>{{nameRef}}</div>
</template><style scoped></style>


http://www.ppmy.cn/devtools/90580.html

相关文章

尚硅谷谷粒商城项目笔记——七、安装rabbitMQ【电脑CPU:AMD】

七、安装rabbitMQ 注意&#xff1a; 因为电脑是AMD芯片&#xff0c;自己知识储备不够&#xff0c;无法保证和课程中用到的环境一样&#xff0c;所以环境都是自己根据适应硬件软件环境重新配置的&#xff0c;这里的虚拟机使用的是VMware。 [!NOTE] 下载RabbitMQ和Erlang的安装…

第10节课:JavaScript基础——网页交互的魔法

目录 JavaScript的作用JavaScript的基本语法基本语法规则变量、数据类型和运算符变量数据类型运算符 实践&#xff1a;使用JavaScript增强网页功能结语 JavaScript是一种高级的、解释型的编程语言&#xff0c;它使得网页能够从静态文档转变为具有动态交互性的应用程序。本节课将…

13.StringRedisTemplete使用

上一篇说到改变了RedisTemplate的默认序列化器后&#xff0c;在redis中存入Java对象后&#xff0c;在redis中的呈现是&#xff1a;会记录类的字节码 这也是代码中可以强制装换为对应的java对象的原因&#xff1a; Test void testStudent() {redisTemplate.opsForValue().set(&q…

速度规划之:起点速度和终点速度不为零的非对称梯形速度规划

起点速度和终点速度不为零的非对称梯形速度规划 一、引言二、理论基础1. 梯形速度规划概述2.数学建模- 变量定义- 约束关系- 公式推导 三、计算过程1.只存在减速段2.只存在加速段3.存在加速段和减速段4.存在加速度段、匀速段和减速段 四、仿真实现五、优缺点优点缺点 六、总结 …

C#裁剪图像的几种方法总结

前言 我们在上位机软件开发过程中经常需要裁剪图像&#xff0c;本文就是对c#中常见的裁剪图像方法进行总结。 1、克隆 直接调用Bitmap的Clone函数&#xff0c;然后指定需要裁剪的区域即可裁剪图像&#xff0c;该种方法不会损失精度 public static Bitmap CropImage_Clone(Bi…

vs+qt一些问题

一直遇到的两个问题&#xff0c;今天解决了 1、 因为前后端分离&#xff0c;前端写完了&#xff0c;后端还在一直修改&#xff0c;但是每次都是单独打开的后端的sln&#xff0c;所以会出现这个&#xff0c;把前端的模块删掉就好了。 2、打开vs项目&#xff0c;很多报错&#…

VUE框架面试整理-组件

在Vue.js中,组件是构建应用的基本单元。组件可以复用、嵌套和管理自己的状态,使得开发大型应用变得更加简单和结构化。以下是关于Vue组件的一些核心概念和用法: 创建和注册组件 全局注册 全局注册的组件可以在任何地方使用。 Vue.component(

强软弱虚四大引用

强引用&#xff1a; 如果一个对象具有强引用&#xff0c;垃圾回收器不会回收该对象&#xff0c;当内存空间不足时&#xff0c;JVM 宁愿抛出 OutOfMemoryError异常。 // 强引用 User usernew User();//user就是强引用软引用&#xff1a; 如果一个对象只具有软引用&#xff0…