位置: IT常识 - 正文

Vue3 reactive丢失响应式问题(vuex状态丢失)

编辑:rootadmin
Vue3 reactive丢失响应式问题

推荐整理分享Vue3 reactive丢失响应式问题(vuex状态丢失),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:vue数据丢失,vue3 reactive ref,vue3.0 reactive,vuex数据丢失怎么处理,vue3.0 reactive,vue报错文件找不到,vue3 reactive不能,vue数据丢失,内容如对您有帮助,希望把文章链接给更多的朋友!

问题描述:使用 reactive 定义的对象,重新赋值后失去了响应式,改变值视图不会发生变化。

测试代码:

<template> <div> <p>{{ title }}</p> <ul> <li v-for="(item, index) in tableData" :key="index">{{ item }}</li> </ul> </div></template><script setup> import { ref, reactive, onMounted } from 'vue' const title = ref('我是标题') let tableData = reactive([1, 2, 3]) onMounted(() => { title.value = '我是段落', tableData = [1, 1, 1] console.log("title=", title) console.log("tableData=", tableData) }) </script>

输出结果:

 

从上述测试代码中,ref 定义的对象有响应式,而 reactive 定义的对象失去了响应式,这是什么原因呢?官网中写到:

Vue3 reactive丢失响应式问题(vuex状态丢失)

如果将一个对象赋值给 ref ,那么这个对象将通过 reactive() 转为具有深层次响应式的对象。

那么,为什么 ref 调用 reactive 处理对象重新赋值后,不会丢失响应式,但 reactive 却丢失了呢?

第一步:当我们修改 xxx.value 值的时候,setter 调用了 toReactive 方法

class RefImpl { constructor(value, __v_isShallow) { this.__v_isShallow = __v_isShallow; this.dep = undefined; this.__v_isRef = true; this._rawValue = __v_isShallow ? value : toRaw(value); this._value = __v_isShallow ? value : toReactive(value); } get value() { trackRefValue(this); return this._value; // get方法返回的是_value的值 } set value(newVal) { newVal = this.__v_isShallow ? newVal : toRaw(newVal); if (hasChanged(newVal, this._rawValue)) { this._rawValue = newVal; this._value = this.__v_isShallow ? newVal : toReactive(newVal); // set方法调用 toReactive 方法 triggerRefValue(this, newVal); } }}

 第二步:toReactive 方法判断是否是对象,是的话就调用 reactive 方法

const toReactive = (value) => isObject(value) ? reactive(value) : value;

 第三步:reactive 方法,先判断数据是否是“只读”的,不是就返回 createReactiveObject() 方法处理后的数据(createReactiveObject 方法将对象通过 proxy 处理为响应式对象)

function reactive(target) { // if trying to observe a readonly proxy, return the readonly version. if (isReadonly(target)) { return target; } return createReactiveObject(target, false, mutableHandlers, mutableCollectionHandlers, reactiveMap);}结论:

ref 定义数据(包括对象)时,都会变成 RefImpl(Ref 引用对象) 类的实例,无论是修改还是重新赋值都会调用 setter,都会经过 reactive 方法处理为响应式对象。 但是 reactive 定义数据(必须是对象),是直接调用 reactive 方法处理成响应式对象。如果重新赋值,就会丢失原来响应式对象的引用地址,变成一个新的引用地址,这个新的引用地址指向的对象是没有经过 reactive 方法处理的,所以是一个普通对象,而不是响应式对象。

如何正确使用 reactive 呢?

使用 reactive 定义数据时,使用对象包含键值对的形式,那么就会避免重新赋值的问题。那么,修改测试代码为:

<template> <div> <p>{{ title }}</p> <ul> <li v-for="(item, index) in obj.tableData" :key="index">{{ item }}</li> </ul> </div></template><script setup> import { ref, reactive, onMounted } from 'vue' const title = ref('我是标题') let obj = reactive({ tableData: [1, 2, 3] }) onMounted(() => { title.value = '我是段落', obj.tableData = [1, 1, 1] }) </script>

本文链接地址:https://www.jiuchutong.com/zhishi/299456.html 转载请保留说明!

上一篇:计算机视觉-OpenCV入门讲解(计算机视觉opencv 有什么项目)

下一篇:遗传算法python进阶理解+论文复现(纯干货,附前人总结引路)(遗传算法排课代码python)

  • 企业微博怎样通过热门事件扩大品牌知名度(企业微博如何加v)

    企业微博怎样通过热门事件扩大品牌知名度(企业微博如何加v)

  • 华为Mate X2支持哪些5g

    华为Mate X2支持哪些5g

  • 华为nova5z多大尺寸(华为nova5z长宽多少cm)

    华为nova5z多大尺寸(华为nova5z长宽多少cm)

  • 钉钉显示网络异常(钉钉显示网络异常登不上)

    钉钉显示网络异常(钉钉显示网络异常登不上)

  • 微信点进去才收到消息怎么办(微信点进去才收得到消息)

    微信点进去才收到消息怎么办(微信点进去才收得到消息)

  • 打印机冒烟怎么回事儿(打印机冒烟了怎么办)

    打印机冒烟怎么回事儿(打印机冒烟了怎么办)

  • Mate30普通版有慢动作吗(mate30速度慢)

    Mate30普通版有慢动作吗(mate30速度慢)

  • 手机掉水里但能正常用(手机掉水里但能正常用,要去维修吗)

    手机掉水里但能正常用(手机掉水里但能正常用,要去维修吗)

  • qq音乐怎么自定义排序(qq音乐怎么自定义歌曲封面)

    qq音乐怎么自定义排序(qq音乐怎么自定义歌曲封面)

  • 如何让微信图片带音乐(如何让微信图片不保存到手机)

    如何让微信图片带音乐(如何让微信图片不保存到手机)

  • 哔哩哔哩音频在哪(哔哩哔哩音频在线提取网站)

    哔哩哔哩音频在哪(哔哩哔哩音频在线提取网站)

  • 笔记本关机后风扇还转电源灯不灭(笔记本关机后风扇继续运行)

    笔记本关机后风扇还转电源灯不灭(笔记本关机后风扇继续运行)

  • 抖音集卡是什么(抖音集卡是什么奖金翻倍)

    抖音集卡是什么(抖音集卡是什么奖金翻倍)

  • 微信视频响2下就对方忙(微信视频响2下就不响了)

    微信视频响2下就对方忙(微信视频响2下就不响了)

  • qq等级43是什么标志(qq等级40级是什么)

    qq等级43是什么标志(qq等级40级是什么)

  • nova和荣耀的区别(nova 和荣耀哪个好一些?)

    nova和荣耀的区别(nova 和荣耀哪个好一些?)

  • 天猫预售定金可以退吗(天猫预售定金可以满减吗)

    天猫预售定金可以退吗(天猫预售定金可以满减吗)

  • 抖音能看到浏览记录吗(抖音能看到浏览的人吗)

    抖音能看到浏览记录吗(抖音能看到浏览的人吗)

  • 参考文献在文中怎么标注(参考文献在文中必须标注吗)

    参考文献在文中怎么标注(参考文献在文中必须标注吗)

  • set协议的交易流程(简述set协议的基本交易流程)

    set协议的交易流程(简述set协议的基本交易流程)

  • 联想硬盘保护系统管理员密码是多少(联想硬盘保护系统怎么关闭)

    联想硬盘保护系统管理员密码是多少(联想硬盘保护系统怎么关闭)

  • 小米手环4充电要多久(小米手环4充电线)

    小米手环4充电要多久(小米手环4充电线)

  • s10反向充电设置(s105g反向充电)

    s10反向充电设置(s105g反向充电)

  • 抖音为什么不能直播(抖音为什么不能直播王者荣耀)

    抖音为什么不能直播(抖音为什么不能直播王者荣耀)

  • 城市维护建设税怎么做分录
  • 税金及附加是负债类吗
  • 一般纳税人服务费税率
  • 个体户也要做实收资本吗
  • 公司组织出去旅游主持词
  • 应收账款和应付账款的区别
  • 应交税费和所得税费用会计分录
  • 出纳人员应该怎么称呼
  • 资产剥离类型
  • 个人交的工会经费个税
  • 企业完税凭证入账后怎么办理退税?
  • 分公司负债,总公司要负担
  • 会计利润和税务利润的暂时性差异和永久性差异
  • 残疾小伙小强
  • 签证费会计分录
  • 实收资本属于会计准则吗
  • 外汇账户怎么开
  • 公司租用员工的车租车协议
  • 每股收益增长率计算公式
  • 什么是现金解款支付
  • phpifelse
  • 甲供材料增值税
  • 购入增值税税控系统专用设备
  • 带息票据和不带息票据区别
  • 公司基本户可以收款吗
  • 关税组成计税价格公式推导
  • 收到投资款的会计科目怎么入账
  • uni-app实例教程
  • blkid命令详解
  • 微信认证费是什么意思
  • 工程物资发生报废损毁
  • 个体户个税征收标准
  • 异地预缴的附加税在申报税时会抵消掉么
  • 征地费用包括
  • 小规模开票软件怎么升级
  • 汽车4s店,厂家返修
  • 固定资产投资入股是否缴纳增值税
  • sql server创建数据表的完整语法
  • 个别计价法优缺点是什么
  • sql跨服务器查询语句
  • 无票收入怎么计算
  • 自行开具增值税专用发票怎么开
  • 公司开业装修费会计分录
  • 保险费用缴纳
  • 公司缴纳社保会计分录怎么做
  • 一般纳税人转小规模纳税人的条件
  • 流转税怎么核算
  • 个人转让不动产交印花税吗
  • 个税起征点提高的意义
  • 物业管理单位收取的物业费征不征收增值税
  • 非居民企业所得税征收方式鉴定表
  • 年终缴税比例
  • 债权投资的交易费用计入成本还是利息调整
  • 社保如何做分录报销
  • 如何冲其他应付款发票
  • 增值税计入固定资产的成本吗
  • 企业办理名称变更怎么办
  • 购买方退货的会计分录怎么写
  • 出售二手固定资产如何开票
  • 租写字楼水电费自己付吗
  • 成本费用和损失的区别
  • sql数据库性能
  • mysql中的ifnull函数
  • mysql@变量
  • 在windows中在下列叙述中正确的是
  • windowsxp无法格式化
  • 如何查看win10版本是不是正版
  • webtrapnt.exe - webtrapnt进程是什么意思
  • Win10系统照片应该打不开
  • windows预体验版本遇到问题
  • dghm.exe是什么程序
  • mcappins.exe - mcappins进程是什么文件 什么意思.
  • win8软件安装
  • win7开机提示重启怎么办
  • unity 链表
  • linux tcptraceroute
  • bootstrap要学吗
  • shell脚本-le
  • javascript $符号
  • 利息发票可以抵扣进项税额吗
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设