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

  • 小度如何连接手机作为音响(小度如何连接手机热点网络)

    小度如何连接手机作为音响(小度如何连接手机热点网络)

  • 移动的魔百盒可以换地方用吗(移动的魔百盒可以投屏吗?)

    移动的魔百盒可以换地方用吗(移动的魔百盒可以投屏吗?)

  • 阿里巴巴网站类型是什么(阿里巴巴网站效果怎么样)

    阿里巴巴网站类型是什么(阿里巴巴网站效果怎么样)

  • 苹果SE是什么基带(iphone se是啥手机)

    苹果SE是什么基带(iphone se是啥手机)

  • 苹果拉黑电话后别人打进来是什么语音(苹果拉黑电话后短信是否可以正常收到)

    苹果拉黑电话后别人打进来是什么语音(苹果拉黑电话后短信是否可以正常收到)

  • 钉钉退群别人会知道吗(钉钉群里退群会被看见吗)

    钉钉退群别人会知道吗(钉钉群里退群会被看见吗)

  • 多媒体数据压缩编码方法可分为哪两大类(多媒体数据压缩技术一般分为)

    多媒体数据压缩编码方法可分为哪两大类(多媒体数据压缩技术一般分为)

  • 物联网流量卡怎么在手机上使用(物联网流量卡怎么激活)

    物联网流量卡怎么在手机上使用(物联网流量卡怎么激活)

  • 哈罗顺风车一个行程能接几单(哈罗顺风车一个月能赚多少钱)

    哈罗顺风车一个行程能接几单(哈罗顺风车一个月能赚多少钱)

  • 笔记本电脑没有电池能开机吗(笔记本电脑没有wifi连接图标不见了)

    笔记本电脑没有电池能开机吗(笔记本电脑没有wifi连接图标不见了)

  • 优酷退出登录在哪里(优酷登陆退出)

    优酷退出登录在哪里(优酷登陆退出)

  • 平板电脑有windows系统的吗(平板电脑有哪些功能?)

    平板电脑有windows系统的吗(平板电脑有哪些功能?)

  • 如何禁小米浏览器自动下载(小米浏览器怎么禁止弹窗)

    如何禁小米浏览器自动下载(小米浏览器怎么禁止弹窗)

  • 网络虚拟化功能最小单元是多少个(网络虚拟化功能特性)

    网络虚拟化功能最小单元是多少个(网络虚拟化功能特性)

  • 手机yy怎么看等级(手机yy怎么看等级高低)

    手机yy怎么看等级(手机yy怎么看等级高低)

  • 医用超声波是如何产生的(超声波q)

    医用超声波是如何产生的(超声波q)

  • 苹果手机怎么调声音(苹果手机怎么调震动和静音)

    苹果手机怎么调声音(苹果手机怎么调震动和静音)

  • qq音乐动图图标可以删吗(qq音乐动图图标重复文件)

    qq音乐动图图标可以删吗(qq音乐动图图标重复文件)

  • 华为荣耀20与荣耀20pro区别(华为荣耀20与荣耀20pro)

    华为荣耀20与荣耀20pro区别(华为荣耀20与荣耀20pro)

  • 香港的电话怎么打(香港的电话怎么填)

    香港的电话怎么打(香港的电话怎么填)

  • 电脑硬盘内存怎么扩大(电脑硬盘内存怎么合并)

    电脑硬盘内存怎么扩大(电脑硬盘内存怎么合并)

  • 7.25 web前端-淘宝首页设计(淘宝前端用什么写的)

    7.25 web前端-淘宝首页设计(淘宝前端用什么写的)

  • swoole_loader 扩展下载(swoole扩展安装)

    swoole_loader 扩展下载(swoole扩展安装)

  • 开外经证需要预缴税几个点
  • 补做前几年税审对报税税务评级有什么影响?
  • 什么是税务代理人
  • 税务缴税流程
  • 小规模纳税人税额怎么做分录
  • 房地产一般纳税人扣除土地价款
  • 税控服务费抵扣的文件
  • 新会计准则开办费分摊
  • 免征增值税企业进项税怎么处理
  • 土地置换账务处理流程
  • 营改增前甲供材料如何纳税
  • 融资租赁咨询服务合同需要交印花税吗
  • 售后人员出差计入哪个科目
  • 行政单位在建工程入账
  • 库存商品一定是存货吗
  • 企业如何处理劳方与资方的关系
  • 小规模减半征收印花税的政策
  • 政策性减免单位社保
  • 设备改造时各项支出的会计处理?
  • 加计抵减政策销售额占比怎么算
  • 其他收入工会经费计税依据
  • 餐饮业会计做账技巧
  • 供应商收费标准
  • 分享php源码批量运行
  • 苹果系统中怎么删除软件
  • 上一年度的费用入账需要分摊吗
  • 盈余 盈利
  • 企业的支付宝
  • php新手入门
  • 成本结转的科目
  • 代开专用发票的流程资料要求
  • 安装nodemodules
  • php提示框
  • Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
  • 员工多交的个人社保
  • vue3生命周期及使用
  • vue从入门到精通教程
  • 协议、合同
  • 残疾人就业保障金计入什么科目
  • 只有进项发票,没有销项可以吗
  • 外币存款利息税
  • 小规模开票软件怎么升级
  • 差旅费算直接人工吗
  • 什么叫金税四期呢?
  • 出口退税款计入营业外收入
  • 衍生工具什么意思
  • 提取折旧的意义
  • 自产产品用于捐赠是否要确认收入
  • 融资租赁固定资产折旧年限
  • 广告公司转让一般多少钱
  • 公益性捐赠全额扣除,企业所得税
  • 发生的费用
  • 合伙企业所得税率
  • 本期应征增值税销售额是什么意思
  • 收到投资款怎么做凭证
  • 年化收益率怎么算
  • windows7卸载所有软件
  • win7一键升级到win10
  • win7系统怎么用
  • centos配置http
  • linux 用处
  • linux jack
  • windows createfile
  • win7定时静音
  • linux更改
  • wps linux版本是什么意思
  • 轻松掌握瓷砖铺贴技术 pdf
  • cocos2dx开发的游戏有哪些
  • cocos2dx怎么用
  • opengl 函数可以在子线程中调用吗
  • JS中setTimeout的巧妙用法前端函数节流
  • unity 游戏保存
  • python操作word文档替换文字
  • java script怎么学
  • 宁波国税局领导名单
  • 成品油消费税税目
  • 国家税务局机打发票可以报销吗
  • 沈阳沈河区税务局待遇
  • 手表关税税率一般是多少
  • 西安市个税证明去哪里打印
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设