位置: 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)

  • ipad青少年模式在哪里设置(ipad青少年模式在哪里关掉)

    ipad青少年模式在哪里设置(ipad青少年模式在哪里关掉)

  • 库乐队无法打开乐曲(库乐队无法打开乐曲需要更高版本)

    库乐队无法打开乐曲(库乐队无法打开乐曲需要更高版本)

  • ai卡了不动怎么办(ai卡住动不了)

    ai卡了不动怎么办(ai卡住动不了)

  • vertu所有型号(vertu v5)

    vertu所有型号(vertu v5)

  • ai复制图层快捷键(ai复制图层样式快捷键)

    ai复制图层快捷键(ai复制图层样式快捷键)

  • 米u12稳定版什么时候更新(米u12发布时间)

    米u12稳定版什么时候更新(米u12发布时间)

  • 快手隐藏作品对账号有影响吗(快手隐藏作品对号有影响吗)

    快手隐藏作品对账号有影响吗(快手隐藏作品对号有影响吗)

  • 解除拉黑后能收到之前的信息吗(解除拉黑后能收到对方的消息吗)

    解除拉黑后能收到之前的信息吗(解除拉黑后能收到对方的消息吗)

  • win7屏幕保护设置不了(win7屏幕保护设置怎么调时间长)

    win7屏幕保护设置不了(win7屏幕保护设置怎么调时间长)

  • 淘宝订单拦截失败什么意思(淘宝订单拦截失败怎么办啊)

    淘宝订单拦截失败什么意思(淘宝订单拦截失败怎么办啊)

  • 华为mate30pro素皮版和玻璃版有什么区别(华为mate30pro素皮版掉皮了怎么办)

    华为mate30pro素皮版和玻璃版有什么区别(华为mate30pro素皮版掉皮了怎么办)

  • qq号被回收之后会清空什么(qq号被回收之后会有人用吗)

    qq号被回收之后会清空什么(qq号被回收之后会有人用吗)

  • 三星序列号R开头是什么机(三星序列号r开头是什么机型)

    三星序列号R开头是什么机(三星序列号r开头是什么机型)

  • 微信辅助一年几次(微信辅助一年三次时间怎么规定)

    微信辅助一年几次(微信辅助一年三次时间怎么规定)

  • 苹果手表怎么随时锁屏(苹果手表怎么随时关机)

    苹果手表怎么随时锁屏(苹果手表怎么随时关机)

  • 华为手机云空间满了怎么办(华为手机云空间的照片怎么删除)

    华为手机云空间满了怎么办(华为手机云空间的照片怎么删除)

  • 息屏时钟会烧屏吗(息屏时钟会烧屏么)

    息屏时钟会烧屏吗(息屏时钟会烧屏么)

  • ipad支持otg吗(ipad支持ot g数据线吗)

    ipad支持otg吗(ipad支持ot g数据线吗)

  • 含光800是什么芯片(含光800与华为芯片)

    含光800是什么芯片(含光800与华为芯片)

  • iPhone11pro有几种机身颜色(苹果11pro有几款)

    iPhone11pro有几种机身颜色(苹果11pro有几款)

  • 苹果笔记本怎么查型号(苹果笔记本怎么截图)

    苹果笔记本怎么查型号(苹果笔记本怎么截图)

  • 华为手机ai测量工具在哪里(华为手机ai测量在哪里打开)

    华为手机ai测量工具在哪里(华为手机ai测量在哪里打开)

  • 什么是双向无线充电(双向wifi是什么意思)

    什么是双向无线充电(双向wifi是什么意思)

  • 手机显示电量怎么设置(手机显示电量怎么弄)

    手机显示电量怎么设置(手机显示电量怎么弄)

  • 全民k歌黑名单有什么用(全民k歌黑名单在哪里找)

    全民k歌黑名单有什么用(全民k歌黑名单在哪里找)

  • 华为平板怎样设置学生模式设置(华为平板怎样设置屏幕使用时间)

    华为平板怎样设置学生模式设置(华为平板怎样设置屏幕使用时间)

  • 华为手机自带放大镜吗(华为手机自带放烟花功能)

    华为手机自带放大镜吗(华为手机自带放烟花功能)

  • 手机清除数据怎么恢复(不用的苹果手机怎么清除所有数据)

    手机清除数据怎么恢复(不用的苹果手机怎么清除所有数据)

  • YOLOv5、v7改进之二十六:改进特征融合网络PANet为ASFF自适应特征融合网络(yolov5改进点)

    YOLOv5、v7改进之二十六:改进特征融合网络PANet为ASFF自适应特征融合网络(yolov5改进点)

  • 一般纳税人的税收优惠政策
  • 一般风险准备是留存收益吗
  • 兼职人员的工资怎么算
  • 不动产销售额怎么填
  • 会计净额法和总额法
  • 总产值和主营业务收入
  • 融资租赁设备增值税怎样抵扣
  • 建筑企业施工管理人员
  • 工伤私了赔偿
  • 费用摊销怎么做
  • 免税产品的销项税
  • 代理药品销售收取佣金会计分录怎么写?
  • 广告服务怎么做分录
  • 上年度的印花税怎么计算
  • 小规模增值税普通发票税率
  • 食堂伙食费怎么入账
  • 收到投资款需要什么原始凭证
  • 待认证税额是几级科目
  • 劳保用品增值税税率是多少
  • 特殊建造行业
  • 融资性售后回租按什么缴纳增值税
  • 公司必须购买税控设备吗
  • 继承房产再出售满五是按老证还是按新证计算时间
  • window11系统怎么用
  • mac复制文件路径后怎么粘贴
  • win7如何取消关机
  • 收到现金支票如何进账
  • 上年度所得税未计提已交本年度如何计提
  • PHP:apache_get_modules()的用法_Apache函数
  • 巴黎先贤祠的名言
  • 关联方借款利息所得税前扣除
  • 公司报销之后钱发到哪
  • 违约金赔偿款怎么开票
  • 企业的生产环节
  • 土地增值税清算全流程实战案例
  • thinkphp excel
  • 收到员工的社保费用记什么科目
  • 为什么开发票能抵税
  • 增值税发票开具规定
  • 留底税额怎么入账
  • 织梦会员系统
  • 赠品怎么做
  • 以货换货怎么交印花税
  • 税率与征收率是怎么回事
  • 商业印花税的计算公式
  • 深入mysql源码
  • 其他应收款主要是什么
  • 报废车怎么处理最划算
  • 固定资产清理的审计目标不包括
  • 不动产租赁开票税率
  • 价外费用延期付款利息
  • 股东以无形资产入股是否需要缴纳个税
  • 已抵扣的增值税怎么做账
  • 其他应收款核算什么
  • 增值税留抵退税申请流程
  • 航天信息服务费280元如何申报
  • mysql8 存储引擎
  • xp系统注册表空白怎么办
  • windows server 2008 企业版
  • 上网本安装win7
  • win7如何新建用户
  • windows终端美化
  • winxp系统笔记本电脑如何开启无线网络
  • linux修改计算机主机名和用户名
  • win8系统切换桌面
  • winxp远程桌面
  • linux bye
  • linux常用命令查询
  • Javascript之Number对象介绍
  • 无缝广告植入
  • python标准库参考手册
  • js 状态模式
  • js数组添加元素的方法
  • 怎么用js实现滑动效果
  • android布局教程
  • 税务 涉税中介
  • 土地增值税有哪些征收方式
  • 广东etc扣费异常打哪个电话
  • 西安车辆购置税缴纳需要什么材料
  • 岗位练兵的作用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设