Vue3---(3)ref,reactive,toRefs,toRef

​

ref

  • 作用: 定义响应式变量。

  • 语法: let name= ref('测试')。

  • 返回值: 一个RefImpl的实例对象,简称ref对象或ref,ref对象的value属性是响应式的。

  • 注意点:

    • JS中操作数据需要:name.value,但模板中不需要.value,直接使用即可。
    • 对于let name = ref('测试')来说,name不是响应式的,name.value是响应式的。
    • 其实ref接收的数据可以是:基本类型 、对象类型。
    • 若ref接收的是对象类型,内部其实也是调用了reactive函数。
xml 复制代码
<template>
  <div>
    <h1>姓名:{{name}}</h1>
  </div>
</template>
<script setup lang="ts">
import {ref} from 'vue'
let name = ref('测试')

</script>

reactive

  • 作用: 定义一个响应式对象 (基本类型不要用它,要用ref,否则报错)
  • 语法: let 响应式对象= reactive(源对象)。
  • 返回值: 一个Proxy的实例对象,简称:响应式对象。
  • 注意点: reactive定义的响应式数据是"深层次"的。
xml 复制代码
<template>
  <div>
    <h1>姓名:{{people.name}}</h1>
    <h1>年龄:{{people.age}}</h1>
  </div>
</template>
<script setup lang="ts">
import {reactive} from 'vue'
let people = reactive({name:'测试',age:18})

</script>

ref和reactive区别

定义数据类型

ref :基本数据类型(如 string、number、boolean),对象数据类型(如 数组,对象)

reactive: 对象数据类型

使用区别

  1. ref创建的变量必须使用.value(可以使用volar插件自动添加.value)。
  2. reactive重新分配一个新对象,会失去 响应式(可以使用Object.assign去整体替换)。

​编辑

实际使用过程中, 一个基本类型的响应式数据,必须使用ref ,对象层级不深ref,reactive两者都行,层级比较多一般用reactive(实际可以ref一把梭,就是代码里面.value比较多,看起来不美观)

toRefs和toRef

  • 作用:将一个响应式对象中的每一个属性,转换为ref对象。常用于 解构 时保持响应式。
  • 备注:toRefs与toRef功能一致,但toRefs可以批量转换。
xml 复制代码
<template>
  <div>
    <h1>姓名:{{people.name}}</h1>
    <h1>年龄:{{people.age}}</h1>
  </div>
</template>
<script setup lang="ts">
import {reactive} from 'vue'
let people = reactive({name:'测试',age:18})
// 通过toRefs 将people中的多个属性取出,并保持响应式能力
let {name,age} = toRefs(people)
// 通过toRef 将people中的某个属性取出,并保持响应式能力
let age = toRef(people,'age')
</script>

面试重点

为什么ref要用.value

  • 基本数据类型 :ref 包装的基本数据类型(如数字、字符串)并不直接是一个对象,它们是原始值。因此,ref 使用 .value 来访问或修改实际的值。
  • 包装行为 :ref 是为了让 Vue 追踪这些数据的变化并保持响应式,使用 .value 是 Vue 设计的一部分,用来明确区分原始值和响应式对象。

为什么reactive不使用.value

  • reactive 是通过 代理对象 来实现响应式的。reactive 返回的是一个 代理对象,当你访问对象的属性时,代理会处理 getter 和 setter 操作来实现响应式。
  • 这种方式是 Vue 3 中的 Proxy API 工作机制的体现,因此不需要 .value,可以直接访问对象的属性。

​

相关推荐
u0111026752 小时前
JPG、PNG、WebP 怎么选?按透明度、体积和使用场景做判断
前端·javascript·vue.js·图像处理·ai作画
雪芽蓝域zzs7 小时前
第 7 节:多边形点击弹窗 + 清空绘制按钮
vue.js
溪语流沙7 小时前
【Web全栈进阶】Composition API与组件通信:props深入、emit、插槽
前端·css·vue.js
顽疲10 小时前
Java vue 养老系统源码详解:入住核算单 live-check 缴费入账与预交金收据实践
java·vue.js·python·java 养老·springboot 养老·vue养老
志尊宝11 小时前
Vue3 零基础每日笔记(088·完结):从零到一——一个完整 Vue3 项目的成长复盘
前端·javascript·vue.js·笔记·ecmascript·#vue.js
桔筐12 小时前
Vue中DOM的data-*自定义属性(dataset)与Vue data响应式变量区别详解
前端·javascript·vue.js
用户17335980753713 小时前
纯前端 PDF 按书签拆分避坑指南:拆分后章节对不上?
前端·javascript·vue.js
雪芽蓝域zzs14 小时前
Webstorm打开uniapp uvue文件报红处理方案
vue.js
撸串-研究生15 小时前
面向景区的综合服务管理平台设计——以稻城亚丁景区为例【附源码】
java·开发语言·vue.js·前后端分离·稻城亚丁景区
志尊宝1 天前
Vue3 零基础每日笔记(082):文件上传实战——el-upload 校验、自定义上传、头像预览
前端·javascript·vue.js·笔记·#javascript·#vue.js