当前位置: 首页 > news >正文

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.mrgr.cn/news/61822.html

相关文章:

  • Python基础学习(八)断点调试
  • 【Python爬虫实战】网络爬虫完整指南:网络协议OSI模型
  • 【AI开源项目】Botpress - 开源智能聊天机器人平台及其部署方案
  • 基于 SM3 的密钥派生函数 (KDF):国密合规的安全密钥生成方案
  • 运维工具之StarWind V2V Converter安装和使用
  • Flutter加载本地HTML的优雅解决方案:轻松实现富文本展示
  • 如何在Linux系统中使用Ansible进行自动化部署
  • [ExoPlayer] 源码编译
  • git lfs 安装方法
  • 嵌入式软件在电子烟开发中的应用
  • 使用 vue3-video-play 视频播放组件过程中遇到的问题
  • Java:数据结构-MapSet
  • Deep InfoMax(DIM)(2019-02-ICLR)
  • 7000元投影仪性价比哪款好?当贝F7 Pro脱颖而出
  • 浏览器本地存储和token封装和浏览器导航栏title的笔记
  • 【遗传算法】孤岛模式下的微电网优化调度模型
  • 将多个commit合并成一个commit并提交
  • 探访宇树科技的G1人形机器人:未来消费级机器人的先驱
  • 闲一品交易平台:SpringBoot技术的新境界
  • Win7如何安装支持asp+mdb程序,安装配置IIS
  • [实时计算flink]安全访问最佳实践
  • 新版达梦数据库查看数据库版本信息id_code无法直接显示版本号
  • NewStarCTF2024-Week4-Web-WP
  • 关于我、重生到500年前凭借C语言改变世界科技vlog.12——深入理解指针(2)
  • 【原创分享】详述中间件的前世今生
  • 北斗短报文终端-全星魅北斗手持终端-北斗有源终端