前言

重要提示:文章只适合初学者,不适合专家!!!

什么是响应式对象?

在Vue3中,响应式对象就是这种智能温控器。当你修改JavaScript对象的数据时,Vue会自动更新网页上显示的内容,无需手动操作DOM。简单来说:数据变,页面自动跟着变。

创建响应式对象的三种方式

1. reactive() - 用于对象

适合处理对象、数组等复杂数据结构

import { reactive } from 'vue';// 创建一个响应式用户对象
const user = reactive({name: '张三',age: 30,hobbies: ['读书', '游泳']
});// 修改属性 - 自动触发更新
user.age = 31; 
user.hobbies.push('登山'); // 数组变化也能检测

2. ref() - 全能选手

适合处理字符串、数字等基本类型,也可以处理对象

import { ref } from 'vue';// 创建一个响应式计数器
const count = ref(0); // 创建响应式字符串
const message = ref('你好Vue3!');// 创建响应式对象(内部会转为reactive)
const settings = ref({theme: 'light',fontSize: 16
});// 修改值时需要通过.value
count.value = 5; 
message.value = '欢迎学习响应式';
settings.value.fontSize = 18;

3. toRefs() - 保持响应性的解构

解决reactive对象解构后丢失响应性的问题

import { reactive, toRefs } from 'vue';const user = reactive({name: '李四',age: 25
});// 普通解构会丢失响应性 ❌
// const { name, age } = user;// 使用toRefs保持响应性 ✅
const { name, age } = toRefs(user);// 在脚本中使用要加.value
console.log(name.value); // "李四"

模板和脚本中使用实战

完整组件示例

<template><div class="user-card"><!-- ref对象在模板自动解包,无需.value --><h2>{{ name }}</h2><!-- reactive对象直接使用属性 --><p>年龄: {{ age }} 岁</p><p>状态: {{ isAdult ? "成年人" : "未成年人" }}</p><!-- 使用ref定义的计算属性 --><p>BMI: {{ bmi }}</p><button @click="increaseAge">过生日</button><button @click="changeName">改名</button><input v-model="userInfo.height" type="number" placeholder="输入身高" /></div>
</template><script setup>
import { reactive, ref, computed, toRefs } from "vue";// 使用ref定义基本类型
const name = ref("王小明");// 使用reactive定义对象
const userInfo = reactive({age: 16,height: 175, // 厘米weight: 70, // 公斤
});// 使用toRefs解构,保持响应性
const { age } = toRefs(userInfo);// 计算属性
const bmi = computed(() => {const heightInM = userInfo.height / 100;return (userInfo.weight / (heightInM * heightInM)).toFixed(1);
});// 基于计算属性的状态
const isAdult = computed(() => userInfo.age >= 18);// 修改基本类型的方法
function changeName() {name.value = name.value === "王小明" ? "李小华" : "王小明";
}// 修改响应式对象的方法
function increaseAge() {userInfo.age += 1;userInfo.weight += 1; // 过生日重了1公斤 😄
}
</script><style>
.user-card {border: 1px solid #ccc;padding: 20px;border-radius: 8px;max-width: 300px;
}
button {margin: 5px;
}
</style>

常见疑问解答

1. ref和reactive该用哪个?

场景推荐使用示例
基本类型(数字、字符串)refconst count = ref(0)
对象和数组reactiveconst user = reactive({...})
需要在组件外部传递值ref模板引用更灵活
表单绑定refv-model="message"
解构对象属性toRefsconst { id } = toRefs(item)

经验法则:默认使用ref,对象/数组用reactive

2. 为什么我的数据变化没有触发更新?

常见原因:

  1. 直接解构reactive对象
    错误:const { age } = user (会丢失响应性)
    正确:const { age } = toRefs(user)

  2. 直接替换reactive对象

    let state = reactive({ count: 0 });
    // 错误方式 - 失去响应性
    state = { count: 1 };
    

    正确做法:修改属性而不是整个对象 ✅
    state.count = 1

  3. 异步更新数据
    需要在数据修改后操作DOM?使用nextTick:

    import { nextTick } from 'vue';count.value++;
    nextTick(() => {// 此时DOM已经更新console.log(document.getElementById('count').textContent);
    });
    

总结:响应式对象核心要点

  1. 核心概念:数据变 ➔ 视图自动更新

  2. 创建方式

    • reactive():用于对象/数组
    • ref():用于基本类型、对象引用
    • toRefs():安全解构对象属性
  3. 模板使用

    • ref对象自动解包(不用.value)
    • reactive对象直接使用属性
  4. 注意事项

    • 避免直接解构reactive对象
    • 修改数组使用push/pop等方法
  5. 经验法则

    “遇到对象用reactive,其他情况用ref”

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

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

相关文章

广州华锐互动携手中石油:AR 巡检系统实现重大突破​

广州华锐互动在 AR 技术领域的卓越成就&#xff0c;通过一系列与知名企业、机构的成功合作案例得以充分彰显。其中&#xff0c;与中石油的合作项目堪称经典&#xff0c;展现了广州华锐互动运用 AR 技术解决实际难题、达成目标的强大实力。​ 中石油作为能源行业的巨擘&#xff…

权威认证!华宇TAS应用中间件荣获CCRC“中间件产品安全认证”

近日&#xff0c;华宇TAS应用中间件顺利通过了中国网络安全审查认证和市场监管大数据中心(CCRC)的信息安全认证&#xff0c;获得了IT产品信息安全认证证书。此次获证&#xff0c;标志着华宇TAS应用中间件在安全性、可靠性及合规性等方面达到行业领先水平&#xff0c;可以为政企…

BI财务分析 – 反映盈利水平利润占比的指标如何分析(下)

之前的文章重点把构成销售净利率、主营业务利润率、成本费用利润率、营业利润率、销售毛利率的分母像销售收入、营业收入、主营业务收入净额、成本费用总额做了比较细致的说明&#xff0c;把这几个基本的概念搞明白后&#xff0c;再来看这几个指标就比较容易理解了。 销售净利…

竹云受邀出席华为开发者大会,与华为联合发布海外政务数字化解决方案

6月20日-22日&#xff0c;华为开发者大会&#xff08;HDC 2025&#xff09;在东莞松山湖盛大召开。作为华为一年一度面向全球开发者的顶级科技盛会&#xff0c;今年的HDC不仅带来了HarmonyOS 6.0 Beta版本、盘古大模型5.5等多项重磅技术和产品更新&#xff0c;更聚集了全球极客…

AI助力游戏设计——从灵感到行动-靠岸篇

OK&#xff0c;朋友&#xff0c;如果你到了这里&#xff0c;那就证明这趟旅程&#xff0c;快要到岸了。 首先&#xff0c;恭喜你&#xff0c;到了需要这一步的时候。其实&#xff0c;如果你有一天真的用到了&#xff0c;希望你可以回来打个卡。行了&#xff0c;不废话&#xf…

vue将页面导出pdf,vue导出pdf ,使用html2canvas和jspdf组件

vue导出pdf 需求&#xff1a;需要前端下载把当前html下载成pdf文件–有十八页超长&#xff0c;之前使用vue-html2pdf组件&#xff0c;但是这个组件有长度限制和比较新浏览器版本限制&#xff0c;所以改成使用html2canvas和jspdf组件 方法&#xff1a; 1、第一步&#xff1a;我…

024 企业客户管理系统技术解析:基于 Spring Boot 的全流程管理平台

企业客户管理系统技术解析&#xff1a;基于Spring Boot的全流程管理平台 在企业数字化转型的浪潮中&#xff0c;高效的客户管理系统成为提升企业竞争力的关键工具。本文将深入解析基于Java和Spring Boot框架构建的企业客户管理系统&#xff0c;该系统涵盖员工管理、客户信息管…

JavaScript性能优化代码示例

JavaScript性能优化实战大纲 性能优化的核心目标 减少加载时间、提升渲染效率、降低内存占用、优化交互响应 代码层面的优化实践 避免全局变量污染&#xff0c;使用局部变量和模块化开发 减少DOM操作频率&#xff0c;批量处理DOM更新 使用事件委托替代大量事件监听器 优化循…

树的重心(双dfs,换根)

思路&#xff1a; 基于树形 DP 的两次遍历&#xff08;第一次dfs计算以某个初始根&#xff08;这里选了 1&#xff09;为根时各子树的深度和与节点数&#xff0c;第二次zy进行换根操作&#xff0c;更新每个节点作为根时的深度和&#xff09; 换根原理&#xff1a; 更换主根&…

官方App Store,直链下载macOS ,无需Apple ID,macOS10.10以上.

前言 想必很多人都有过维修老旧Mac的体验,也有过想要重装macos的体验. 尤其是前者,想要重装或者升级系统,由于官方已经无法更新,必须下载iSo镜像 这时就会遇到死循环:想要更新macOS ,必须先使用更高版本的App Store,但要使用更高版本的App Store,必须先更新macOS !!! 如果想…

芋道生成前端界面代码详解

一、搜索框 1、整体架构 <ContentWrap> ... </ContentWrap><ContentWrap> 是页面布局容器&#xff08;可能是自定义组件&#xff09;&#xff0c;包裹住页面的内容区域。 2、el-form 表单&#xff08;搜索区域&#xff09; 2.1参数 <el-formclass&quo…

小程序入门:推广技巧与运行数据查看解析

在当今数字化时代&#xff0c;小程序的应用愈发广泛&#xff0c;无论是企业还是个人开发者&#xff0c;都希望自己的小程序能够获得更多用户关注并顺利运行。本文将详细介绍小程序发布的流程、推广策略以及如何查看运行数据&#xff0c;助力开发者更好地运营小程序。 一、小程…

sql server 将nvarchar长度设置成max有什么隐患

在学习 SQL Server 的过程中&#xff0c;很多开发者会选择将 NVARCHAR 字段的长度设置为 MAX&#xff0c;以便于存储大量文本数据。虽然这样的设计在某些情况下可能会带来便利&#xff0c;但却潜藏着诸多隐患。本文将通过步骤性指导&#xff0c;帮助你理解这些隐患及其解决方式…

电商数据爬取实战:如何挖掘隐藏的商业价值 ||电商API接口的应用价值

当你在深夜浏览电商平台&#xff0c;目光被那些标注着“月销10万”的商品所吸引时&#xff0c;你是否曾思考过——这些惊人的数字背后隐藏着怎样的商业秘密&#xff1f;今天&#xff0c;就让我们化身为电商数据猎手&#xff0c;挥舞起爬虫这把锋利的手术刀&#xff0c;精心解剖…

​​MQTT​​通讯:​​物联网

​​MQTT​​通讯&#xff1a; ​​物联网&#xff08;IoT&#xff09;​​&#xff1a;传感器数据上报&#xff08;温度、湿度&#xff09;、智能家居设备控制。 ​​弱网络环境​​&#xff1a;移动网络、卫星通信&#xff08;如远程农业监测&#xff09;。 ​​云端集成​​…

swagger访问不了的解决方案 http://localhost:8080/swagger-ui/index.html

确保增加 swagger 依赖 pom.xml <!-- Swagger --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.5.0</version></dependency> 在浏览器打开…

在 .NET Core WebAPI 项目中,执行文件(.exe)方式运行并指定端口

✅ 方法一&#xff1a;使用命令行指定端口 .NET Core WebAPI 项目默认使用 Kestrel Web 服务器&#xff0c;你可以通过环境变量或命令行参数来覆盖默认监听地址和端口。 示例命令&#xff1a; MyApi.exe --urls "http://localhost:5001"或者绑定所有主机地址&…

前缀树进阶-经典案例详解

前缀树进阶-经典案例详解 一、前缀树基础内容回顾二、单词搜索建议系统2.1 问题描述2.2 解题思路2.3 Java代码实现2.4 复杂度分析 三、单词编码3.1 问题描述3.2 解题思路3.3 Java代码实现3.4 复杂度分析 四、最长单词4.1 问题描述4.2 解题思路4.3 Java代码实现4.4 复杂度分析 我…

Redis集群实现方式

✅ 一、什么是 Redis 集群&#xff08;Redis Cluster&#xff09; Redis 集群是 Redis 官方在 3.0 版本引入的分布式部署方案&#xff0c;它的目标是解决以下几个问题&#xff1a; 单个 Redis 实例容量有限&#xff08;最多只能使用一个服务器的内存&#xff09; 单点故障&am…

《中国电信运营商骨干网:历史、现状与未来演进》系列 第五篇:新玩家入局——中国广电CBNNET如何构建全国一张网?

专栏引言 在中国电信、联通、移动三足鼎立的骨干网格局中&#xff0c;一位身负特殊使命的“国家队新兵”正加速入场。它就是中国广电。根据2023年发布的《广电网络融合发展战略》&#xff0c;其核心任务是构建一张“新型广电网络”。手握700MHz“黄金频段”和5G牌照&#xff0c…