vue3 ref和reactive踩坑

起因:开发时做一个列表状态筛选,遇到了数据更新但视图层没有更新的情况,把数据改为ref去操作即完成响应式数据的更新。

     const hourRoomTableData = reactive([]}if (val == '1') {hourRoomTableData = hourRoomTableData.filter((item) => item.isEnable);} else if (val == '2') {hourRoomTableData = hourRoomTableData.filter((item) => !item.isEnable);}

ref 和 reactive 是 Vue3 中实现响应式数据的核心 API。ref 用于包装基本数据类型,而 reactive 用于处理对象和数组。尽管 reactive 似乎更适合处理对象,但 Vue3 官方文档更推荐使用 ref。

1.ref

ref 是一个函数,它接受一个内部值并返回一个响应式且可变的引用对象。这个引用对象有一个 .value 属性,该属性指向内部值。
ref 支持深层响应性,这意味着它可以追踪和更新嵌套对象和数组中的变化。这种特性使得 ref 非常适合处理复杂的数据结构,如对象和数组。
ref 提供了高度的灵活性,尤其在处理「普通赋值」方面。这种灵活性使得 ref 在开发中的使用更加方便,特别是在进行复杂的数据操作时。

import { ref } from 'vue';let state = ref({count: 0,name: 'Vue'
});// 替换整个对象
state.value = {count: 10,name: 'Vue 4'
};
// 修改对象内的属性
state.value.count = 20;
state.value.name = 'Vue 5';
// 添加新的属性
state.value.newProperty = 'New Property';
// 删除属性
delete state.value.newProperty;
// 使用解构更新属性(注意要保持响应性)
let { count, name } = state.value;
state.value = { count: count + 1, name };
// 复杂操作,例如根据条件更新属性
if (someCondition) {state.value = {...state.value,name: 'Updated Name'};
}
console.log(state.value)

2.reactive

reactive 是一个函数,它接受一个对象并返回该对象的响应式代理,也就是 Proxy。
注意,ref核心是返回「响应式且可变的引用对象」,而reactive核心是返回的是「响应式代理」,这是两者本质上的核心区别,也就导致了ref优于reactive。
直接赋值对象」:如果直接将一个响应式对象赋值给另一个变量,将会失去响应性。这是因为 reactive 返回的是对象本身,而不仅仅是代理。

import { reactive } from 'vue';let state = reactive({ count: 0 });
state = { count: 1 }; // 失去响应性

「直接替换响应式对象」:同样,直接替换一个响应式对象也会导致失去响应性。

import { reactive } from 'vue';
let state = reactive({ count: 0 });
state = reactive({ count: 1 }); // 失去响应性

直接解构对象」:在解构响应式对象时,如果直接解构对象属性,将会得到一个非响应式的变量。

const state = reactive({ count: 0 });
let { count } = state;
count++; // count 仍然是 0

解决这个问题,需要使用 toRefs 函数来将响应式对象转换为 ref 对象。

import { toRefs } from 'vue';const state = reactive({ count: 0 });
let { count } = toRefs(state);
count++; // count 现在是 1

将响应式对象的属性赋值给变量」:如果将响应式对象的属性赋值给一个变量,这个变量的值将不会是响应式的。

let state = reactive({ count: 0 })let count = state.count
count++  // count 仍然是 0
console.log(state.count)

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

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

相关文章

git 入门作业

任务1: 破冰活动:自我介绍任务2: 实践项目:构建个人项目 git使用流程: 1.将本项目直接fork到自己的账号下,这样就可以直接在自己的账号下进行修改和提交。 这里插一条我遇到的问题,在fork的时候没有将那个only camp4的…

学webpack之loader原理,让面试官跪下来唱征服

引言 什么是loader? 众所周知,webpack是个只能识别js和json文件的小笨蛋,所以就要有loader来转换,让文件能被webpack识别到,从而顺利打包,loader还能对资源进行优化,如压缩图片,代…

前端如何优化页面中的大量任务

直奔主题,如果页面中有100万个任务需要执行,怎么保证页面不卡顿? 可以采取以下几种策略: 任务分片执行: 利用requestIdleCallback和requestAnimationFrame来分片执行任务。requestIdleCallback可以在浏览器空闲时执行…

NumPy Ndarray学习

1.NumPy Ndarray 对象简介 NumPy 最重要的特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。ndarray 对象是用于存放同类型元素的多维数组。ndarray 中的每个元素在内存中都有相同存储大小的区域。 2.N…

网络层3——IP数据报转发的过程

目录 一、基于终点的转发 1、理解 2、IP数据报转发过程 二、最长前缀匹配 1、理解 2、主机路由 3、默认路由 三、二叉线索查找 一、基于终点的转发 1、理解 理解什么叫终点转发 IP数据报的传递,交给路由器后 可不可以做到直接发送给目的主机呢?…

【UGUI】为射击游戏添加动态显示的分数和血量到UI界面

项目背景 在这个项目中,我们希望实现一个简单的游戏系统,其中玩家可以通过击中目标来获得分数,同时通过与怪物碰撞来减少血量。分数和血量需要在游戏界面上实时显示,以便玩家能够随时了解自己的状态。 技术实现 1. 静态变量的使…

使用Spring Boot搭建简单的web服务

1 引言 1.1 Spring Boot简介 Spring Boot是由Pivotal团队提供的一套开源框架,旨在简化Spring应用的创建及部署。 一、核心设计思想 Spring Boot的核心设计思想是“约定优于配置”(Convention Over Configuration,简称COC)。这…

「C/C++」C/C++标准库 之 #include<cstdlib> 通用工具函数库

✨博客主页何曾参静谧的博客📌文章专栏「C/C」C/C程序设计📚全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

CTF压缩包破解神器bkcrack教程和详细使用过程

kali安装bkcrack教程和详细使用过程 1.bkcrack介绍:2.bkcrack功能:3.bkcrack安装:Linux-Kali下:测试:Windows下安装: 4.bkcrack的使用方法:4.1查看相关参数4.2恢复内部密钥从 zip 档案中加载数据…

基于Python的乡村居民信息管理系统【附源码】

基于Python的乡村居民信息管理系统 效果如下: 系统主页面 系统登录页面 管理员主页面 居民管理页面 政务学习页面 土地信息管理页面 个人信息管理页面 居民登陆页面 村委人员主页面 研究背景 随着信息技术的飞速发展和乡村振兴战略的深入实施,传统的乡…

UI设计公司—兰亭妙微—提供轨道交通行业UI设计

蓝蓝设计工作室2008年开始,2011年正式成立北京兰亭妙微科技有限公司,主创清华团队,专注软件和互联网ui设计开发,擅长企业信息化管理、监控、大数据软件UIUE咨询和设计开发服务。立足UI,一直在学习进步。交通行业UE UI解…

2-Ubuntu/Windows系统启动盘制作

学习目标: 掌握使用Win32DiskImager、Rufus等工具制作系统启动盘的基本步骤。独立将ISO镜像文件写入USB闪存驱动器,确保在需要时顺利安装或修复系统。通过学习如何选择正确的源文件和目标驱动器,理解启动盘的使用场景和注意事项,…

Java项目管理与SSM框架介绍

Maven简介 Maven是一个项目管理工具。它可以帮助程序员构建工程,管理jar包,编译代码,完成测试,项目打包等等。Maven工具是基于POM(Project Object Model,项目对象模型)实现的。在Maven的管理下每…

数字证书的简单记录

CA(Certificate Authority):即数字证书颁发认证机构。 CA数字证书(crt/cer证书):数字证书 申请者与颁发者信息申请者公钥颁发者签名,由CA机构使用私钥签名得到数字证书。 CA中间证书&#xff1…

CGAL生成简单形状

三角形 四边形 立方体 六面体 棱柱 锥体 二十面体 网格 Polyhedron _mesh;/**************三角形************/CGAL::make_triangle(K::Point_3(100, 0, 0), K::Point_3(0, 100, 0), K::Point_3(0, 0, 0), _mesh);CGAL::IO::write_polygon_mesh("F:/WORK/STL/triangle.stl…

【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】题库(2)

前言 大家好吖,欢迎来到 YY 滴计算机网络 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 本博客主要内容,收纳了一部门基本的计算机网络题目,供yy应对期中考试复习。大家可以参考 欢迎订阅 YY滴其他专栏!…

江协科技STM32学习- P30 FlyMCU串口下载STLink Utility

🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝​…

【Python】【数据可视化】【商务智能方法与应用】课程 作业一 飞桨AI Studio

作业说明 程序运行和题目图形相同可得90分,图形显示有所变化,美观清晰可适当加分。 import matplotlib.pyplot as plt import numpy as npx np.linspace(0, 1, 100) y1 x**2 y2 x**4plt.figure(figsize(8, 6))# yx^2 plt.plot(x, y1, -., labelyx^2,…

提高后端接口性能的方法

个人bibilailai(不喜请跳过):前几天参加的部门技术分享会,同事分享了一个内容为“提高接口性能的常见技巧”,个人觉得很有用,所以想在这里分享给大家,希望对刚入职场不久的兄弟姐妹们有所帮助。…

.net Core 使用Panda.DynamicWebApi动态构造路由

我们以前是通过创建controller来创建API,通过controller来显示的生成路由,这里我们讲解下如何不通过controller,构造API路由 安装 Panda.DynamicWebApi 1.2.2 1.2.2 Swashbuckle.AspNetCore 6.2.3 6.2.3添加ServiceAction…