我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Vue3中reactive丢失响应式问题怎么解决

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Vue3中reactive丢失响应式问题怎么解决

本篇内容主要讲解“Vue3中reactive丢失响应式问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3中reactive丢失响应式问题怎么解决”吧!

问题描述:

使用 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>

输出结果:

Vue3中reactive丢失响应式问题怎么解决

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

如果将一个对象赋值给 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>

Vue3中reactive丢失响应式问题怎么解决

到此,相信大家对“Vue3中reactive丢失响应式问题怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Vue3中reactive丢失响应式问题怎么解决

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Vue3中reactive丢失响应式问题怎么解决

本篇内容主要讲解“Vue3中reactive丢失响应式问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3中reactive丢失响应式问题怎么解决”吧!问题描述:使用 reacti
2023-07-05

vue3原始值响应方案及响应丢失问题怎么解决

一、ref的引入ref就是解决proxy无法直接代理原始值的问题。我们先来看ref的使用:constname=ref(&#39;小黑子&#39;)ref是怎么实现的呢?其实就是用对象“包裹”原始值。我们再来看一下ref的实现:functionref(val){//使用对象包裹原始值constwrapper={value:val}//利用reactive将对象变成响应式数据returnreactive(wrapper)}ref的实现就是这么简单。ref对原始值响应主要就做了这两件事
2023-05-14

vue3原始值响应方案及响应丢失问题解读

这篇文章主要介绍了vue3原始值响应方案及响应丢失问题解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-16

vue3中给数组赋值丢失响应式的解决

这篇文章主要介绍了vue3中给数组赋值丢失响应式的解决方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-16

vue3结构赋值失去响应式引发的问题怎么解决

这篇文章主要介绍“vue3结构赋值失去响应式引发的问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue3结构赋值失去响应式引发的问题怎么解决”文章能帮助大家解决问题。原始值的响应式系统的
2023-07-02

Vue3 ref构建响应式变量失效怎么解决

这篇“Vue3 ref构建响应式变量失效怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue3 ref构建响应式变量
2023-07-06

怎么解决curl php post 丢失问题

本篇内容主要讲解“怎么解决curl php post 丢失问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决curl php post 丢失问题”吧!php curl post数据丢失是
2023-06-20

Vue3ref构建响应式变量失效问题及解决

这篇文章主要介绍了Vue3ref构建响应式变量失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-05-16

怎么解决php字节丢失乱码问题

这篇文章主要介绍怎么解决php字节丢失乱码问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php字节丢失乱码的解决办法:1、使用“mb_substr($str, 0, 1, gbk);”方法截取中文字符串;2、通过
2023-06-22

vue中provide inject的响应式监听问题怎么解决

这篇文章主要介绍“vue中provide inject的响应式监听问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue中provide inject的响应式监听问题怎么解决”文章能帮助大
2023-06-30

Laravel框架中怎么解决响应问题

本篇内容主要讲解“Laravel框架中怎么解决响应问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Laravel框架中怎么解决响应问题”吧!Laravel中的响应在Laravel中,响应是服务
2023-07-06

windows无法修复dll丢失问题怎么解决

今天小编给大家分享一下windows无法修复dll丢失问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。解决方法1、
2023-07-04

springboot响应过长问题怎么解决

在Spring Boot中,当响应的数据量过大时,可能会导致响应时间过长或者内存溢出的问题。以下是一些解决方案:分页查询:将响应数据进行分页,每次只返回部分数据。可以使用Spring Data JPA中的分页查询功能,或者手动实现分页查询逻
2023-10-26

解决Go语言Websocket应用程序中的数据丢失问题

在Go语言的Websocket应用程序中,数据丢失问题是一个常见的问题。由于Websocket采用的是异步传输方式,数据包可能会在传输过程中丢失或损坏。这种情况下,如何解决数据丢失问题,是每个开发人员都需要面对的挑战。本文将介绍一些解决Go
解决Go语言Websocket应用程序中的数据丢失问题
2023-12-14

亚马逊服务器主机丢失怎么解决问题

检查主机IP地址:首先要检查亚马逊服务器主机的IP地址是否正确设置,以确保正确连接到服务器。检查网络连接:检查服务器与其他网络设备的连接是否正常,如网线、路由器等。检查防火墙设置:检查防火墙是否阻止了服务器与其他设备的连接,如果是,则需要更新防火墙设置。检查SSL证书:如果SSL证书未生效,则需要检查SSL证书是否已经过期或者是否被更换。检查备份文件:检查服务器上的备份文件是否被正确备份,并且是否...
2023-10-27

Win7中快捷方式图标丢失问题的解决方法(最新)

有人也许会尝试在快捷方式属性里更改图标,但编程结果也是无济于事,但个别图标在我们重装了程序后能够解决修正过来,但是有些重装后也没用。出现这个问题最多的软件是360安全卫士、QQ等等~~!好吧!下面是小编整理的几种解决方法,需要的同学就试试吧
2023-05-26

SpringBoot中Ajax跨域及Cookie无法获取丢失问题怎么解决

这篇文章主要介绍“SpringBoot中Ajax跨域及Cookie无法获取丢失问题怎么解决”,在日常操作中,相信很多人在SpringBoot中Ajax跨域及Cookie无法获取丢失问题怎么解决问题上存在疑惑,小编查阅了各式资料,整理出简单好
2023-07-05

租用服务器发生数据丢失问题怎么解决

租用服务器发生数据丢失问题可能是由多种原因引起的,例如硬件故障、人为操作失误、网络问题等。以下是一些解决方法:数据备份:在租用服务器上定期进行数据备份是最有效的预防措施。备份数据可以帮助您在发生数据丢失时快速恢复数据。数据恢复工具:如果数据
租用服务器发生数据丢失问题怎么解决
2024-04-23

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录