iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Vue3中reactive丢失响应式问题怎么解决
  • 478
分享到

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

2023-07-05 17:07:33 478人浏览 八月长安
摘要

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

本篇内容主要讲解“vue3Reactive丢失响应式问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习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丢失响应式问题怎么解决”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: Vue3中reactive丢失响应式问题怎么解决

本文链接: https://www.lsjlt.com/news/354091.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Vue3中reactive丢失响应式问题怎么解决
    本篇内容主要讲解“Vue3中reactive丢失响应式问题怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Vue3中reactive丢失响应式问题怎么解决”吧!问题描述:使用 reacti...
    99+
    2023-07-05
  • vue3原始值响应方案及响应丢失问题怎么解决
    一、ref 的引入ref 就是解决 proxy 无法直接代理原始值的问题。我们先来看 ref 的使用:const name = ref('小黑子')ref 是怎么实现的呢?其实就是用对象“包裹”原始值。我们再来看一下 ref...
    99+
    2023-05-14
    Vue3
  • vue3原始值响应方案及响应丢失问题解读
    目录前言一、ref 的引入二、isref 的实现三、响应丢失1、toRef登场2、toRefs 加入3、诡异的其它响应式丢失情况四、unref 自动脱 ref   ...
    99+
    2023-05-16
    vue3原始值响应 vue3响应丢失 vue3响应
  • vue3中给数组赋值丢失响应式的解决
    目录vue3给数组赋值丢失响应式的解决reactive响应式数据赋值问题总结vue3给数组赋值丢失响应式的解决 由于vue3使用proxy,对于对象和数组都不能直接整个赋值。 只有...
    99+
    2023-05-16
    vue3给数组赋值 vue3丢失响应式 vue3赋值
  • vue3原始值响应丢失如何解决
    今天小编给大家分享一下vue3原始值响应丢失如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、ref 的引入ref ...
    99+
    2023-07-06
  • vue3结构赋值失去响应式引发的问题怎么解决
    这篇文章主要介绍“vue3结构赋值失去响应式引发的问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue3结构赋值失去响应式引发的问题怎么解决”文章能帮助大家解决问题。原始值的响应式系统的...
    99+
    2023-07-02
  • Vue3中的ref和reactive响应式原理解析
    目录1 ref2 isref判断是不是一个ref对象3 shallowref创建一个跟踪自身.value变化的 ref,但不会使其值也变成响应式的4 triggerRef5 cust...
    99+
    2022-11-13
    Vue3 ref和reactive响应式 Vue3 ref和reactive
  • Vue3响应式的ref与reactive怎么使用
    这篇文章主要讲解了“Vue3响应式的ref与reactive怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue3响应式的ref与reactive怎么使用”吧!ref:定义基本数据类...
    99+
    2023-07-04
  • Vue3 ref构建响应式变量失效怎么解决
    这篇“Vue3 ref构建响应式变量失效怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Vue3 ...
    99+
    2023-07-06
  • vue3解构赋值失去响应式引发的问题思考
    目录前言原始值的响应式系统的实现为什么ES6 解构,不能随意使用会破坏他的响应式特性proxy背景实现原理解构 props 对象,因为它会失去响应式直接赋值rea...
    99+
    2024-04-02
  • 怎么解决curl php post 丢失问题
    本篇内容主要讲解“怎么解决curl php post 丢失问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么解决curl php post 丢失问题”吧!php curl post数据丢失是...
    99+
    2023-06-20
  • Vue3ref构建响应式变量失效问题及解决
    目录vue3 ref构建响应式变量失效问题描述解决方案vue3响应式API之ref和reactive回顾Vue3总结vue3 ref构建响应式变量失效 问题描述 在Vue3中使用re...
    99+
    2023-05-16
    Vue3 ref ref构建响应式变量 Vue3响应式失效
  • 怎么解决php字节丢失乱码问题
    这篇文章主要介绍怎么解决php字节丢失乱码问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php字节丢失乱码的解决办法:1、使用“mb_substr($str, 0, 1, 'gbk');...
    99+
    2023-06-22
  • vue中provide inject的响应式监听问题怎么解决
    这篇文章主要介绍“vue中provide inject的响应式监听问题怎么解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue中provide inject的响应式监听问题怎...
    99+
    2023-06-30
  • Vue3 ref构建响应式变量失效如何解决
    const title = ref("Hello, Vue 3!");ref 接收参数并将其包裹在一个带有 value 属性的对象中返回,然后可以使用该属性访问或更改响应式变量的值,比如上面的代码我们使用 count.v...
    99+
    2023-05-14
    Vue3 ref
  • Laravel框架中怎么解决响应问题
    本篇内容主要讲解“Laravel框架中怎么解决响应问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Laravel框架中怎么解决响应问题”吧!Laravel中的响应在Laravel中,响应是服务...
    99+
    2023-07-06
  • vue3怎么使用ref和reactive定义和修改响应式数据
    这篇文章主要介绍“vue3怎么使用ref和reactive定义和修改响应式数据”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue3怎么使用ref和reactive定义和修改响应式数据”文章能帮助大...
    99+
    2023-07-04
  • windows无法修复dll丢失问题怎么解决
    今天小编给大家分享一下windows无法修复dll丢失问题怎么解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。解决方法1、...
    99+
    2023-07-04
  • vue3中defineProps传值使用ref响应式失效详解
    子组件接收父组件的传参。 父组件: <template> <Son :data="data"/> </template> <script ...
    99+
    2024-04-02
  • springboot响应过长问题怎么解决
    在Spring Boot中,当响应的数据量过大时,可能会导致响应时间过长或者内存溢出的问题。以下是一些解决方案: 分页查询:将响...
    99+
    2023-10-26
    springboot
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作