Vue3响应式方法区别:ref、reactive、shallowRef和shallowReactive

Vue 3的响应性系统是其数据绑定的核心,它使得在响应式状态发生变化时,自动更新DOM成为可能。在本文中,我们将深入探讨Vue 3中四种重要的响应性方法:refreactiveshallowRefshallowReactive,并为你清晰解释它们的用途和区别。


一、ref():简单而强大

ref()是Vue 3中官方推荐的创建可变和响应式值的方式。它可用于处理原始值和非原始值,并支持深度响应性,即嵌套对象和数组内部的属性也是响应式的。这一方法使得在访问值时需要使用.value

示例:

xml 复制代码
<template>
  <h1>{{ student.age }}</h1>
  <button @click="addAge">点击我</button>
</template>
​
<script setup>
import { ref } from "vue";
​
const student = ref({
  name: "Tsz",
  age: 20
});
​
function addAge() {
  student.value.age += 10;
}
</script>

二、shallowRef():性能优化的选择

shallowRef()ref()类似,但它不支持深度响应性。只有通过.value访问时具有响应性,对状态的嵌套对象属性或数组元素的修改不会触发响应性。这一方法在需要优化性能并避免不必要的深度响应性跟踪时非常有用。

示例:

xml 复制代码
<template>
  <h1>{{ student.name }}</h1>
  <button @click="changeName">更改姓名</button>
</template>
​
<script setup>
import { shallowRef } from "vue";
​
const student = shallowRef({
  name: "Tsz",
  age: 20,
  comments: ["好文", "继续努力"]
});
​
function changeName() {
  student.value.name = "Alice";
  student.value.comments.push("我喜欢它");
}
</script>

三、reactive():对象的完全响应性

reactive()是用于在Vue 3中声明具有多个属性的对象的方法。使用reactive,整个对象变得响应式,包括对象内部的属性。这意味着对象内的属性会在更改时自动触发视图更新。

示例:

xml 复制代码
<template>
  <div>
    <h1>{{ student.name }}</h1>
    <p>年龄: {{ student.age }}</p>
    <button @click="updateStudent">更新学生信息</button>
  </div>
</template>
​
<script setup>
import { reactive } from "vue";
​
const student = reactive({
  name: "Tsz",
  age: 20
});
​
function updateStudent() {
  student.name = "Alice";
  student.age = 25;
}
</script>

四、shallowReactive():根属性的响应性

shallowReactive()reactive() 类似,但不同之处在于它只会使对象本身变得响应式,而不会深度追踪对象内部属性的变化。这意味着只有对象的属性被修改时才会触发响应,而对象内部嵌套的属性不会自动触发响应。

示例:

xml 复制代码
<template>
  <div>
    <h1>{{ student.name }}</h1>
    <p>年龄: {{ student.age }}</p>
    <button @click="updateStudent">更新学生信息</button>
  </div>
</template>
​
<script setup>
import { shallowReactive } from "vue";
​
const student = shallowReactive({
  name: "Tsz",
  age: 20,
  comments: ["好文", "继续努力"]
});
​
function updateStudent() {
  student.name = "Alice";
  student.age = 25;
  student.comments.push("我喜欢它");
}
</script>

在Vue 3中,根据你的具体需求,选择适当的方法可以帮助你提高开发效率并优化性能。希望本文对你理解Vue 3的响应性方法有所帮助。如果大家对这些方法有任何疑问可以留言讨论。

相关推荐
梦想很大很大5 分钟前
使用 Go + Gin + Fx 构建工程化后端服务模板(gin-app 实践)
前端·后端·go
We་ct7 分钟前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
张3蜂14 分钟前
深入理解 Python 的 frozenset:为什么要有“不可变集合”?
前端·python·spring
无小道15 分钟前
Qt——事件简单介绍
开发语言·前端·qt
广州华水科技17 分钟前
GNSS与单北斗变形监测技术的应用现状分析与未来发展方向
前端
code_YuJun39 分钟前
corepack 作用
前端
千寻girling40 分钟前
Koa.js 教程 | 一份不可多得的 Node.js 的 Web 框架 Koa.js 教程
前端·后端·面试
全栈前端老曹41 分钟前
【MongoDB】Node.js 集成 —— Mongoose ORM、Schema 设计、Model 操作
前端·javascript·数据库·mongodb·node.js·nosql·全栈
code_YuJun42 分钟前
pnpm-workspace.yaml
前端
天才熊猫君1 小时前
“破案”笔记:iframe动态加载内容后,打印功能为何失灵?
前端