【vue3】优雅的解决reactive()响应式对象初始化重新赋值问题v2

这篇具有很好参考价值的文章主要介绍了【vue3】优雅的解决reactive()响应式对象初始化重新赋值问题v2。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关联的上篇文章:

【vue3】优雅的解决reactive()响应式对象初始化重新赋值问题_vue3 reactive重新赋值_oumae-kumiko的博客-CSDN博客

在上面该文章提到了reactive该api的不方便之处和相关重置数据方法的解析。下面提供的方法就是自己封装的`$reactive`方法,通过该方法返回响应式数据和重置数据的方法。 

import { ref } from "vue";
import { isTypeof, deepClone } from "@utils/index";
import { ElMessage } from "element-plus";

interface $ReactiveOptions<K extends string | number | symbol, V> {
    data: V;
    reset: () => void;
}
type $Reactive = <V extends object, K extends keyof V>(data: V) => $ReactiveOptions<K, V>; 
export const $reactive: $Reactive = (data) => {
    let types = isTypeof(data);
    if (types !== "object") {
        ElMessage.error("$reactive函数传入参数错误,只允许传入普通object类型");
        return;
    }
    let originData = deepClone(data);
    let rData = ref(data);
    function reset() {
        for (const key in rData.value) {
            delete rData.value[key];
        }
        deepClone(originData, rData.value);
    }
    return {
        data: rData.value,
        reset,
    };
};
function clone(obj: object, target?: object) {
    if (typeof obj !== "object" || obj == null) {
        return obj;
    }
    let res;
    if (Array.isArray(obj)) {
        res = [];
    } else {
        res = {};
    }
    for (const key in obj) {
        if (target) {
            target[key] = clone(obj[key], target[key]);
        } else {
            res[key] = clone(obj[key]);
        }
    }
    return res;
}

// 第一个参数为被拷贝的对象;第二个参数为输出对象,若有第二个参数,则将拷贝对象的值直接赋给输出对象
type DeepClone = (data: object, target?: object) => object;
export const deepClone: DeepClone = (cloneData, target) => {
    if (typeof cloneData === "object" && cloneData !== null) {
        let obj = {};
        if (target) {
            clone(cloneData, target);
        } else {
            obj = clone(cloneData);
        }
        return obj;
    } else {
        alert("deepClone的参数请传入普通对象/数组");
    }
};
// 接收一个参数,返回一个字符串说明是哪个数据类型,且capsLook为1则大写开头,非1或不传则小写开头 //! 警告:最好统一小写,避免维护麻烦和快速认知相关代码
type IsTypeof = (data: any, capsLook?: number) => string;
export const isTypeof: IsTypeof = (data, capsLook) => {
    let str = Object.prototype.toString.call(data);
    str = str.match(/\[object (\S*)\]/)[1];
    str = capsLook ? str.toUpperCase() : str.toLowerCase();
    return str;
};

QQ交流群:522976012  ,欢迎来玩。

聚焦vue3,但不限于vue,任何前端问题,究其本质,值得讨论,研究与学习。文章来源地址https://www.toymoban.com/news/detail-618427.html

到了这里,关于【vue3】优雅的解决reactive()响应式对象初始化重新赋值问题v2的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 解决在vue3中使用reactive响应式,赋值后造成页面不改变的问题?

    我们需要在vue3中使用服务器的数据渲染到页面上,我使用的是reactive生成的响应式数据属性,但是在挂载后请求的数据并没有渲染显示到页面上。 技术: vue3 、 element-ui-plus home.vue 我们通过直接赋值,可以看出数据变为普通的数据了,并不是响应式的。 代码如下: 可以看出

    2023年04月26日
    浏览(40)
  • vue3 - 使用reactive定义响应式数据进行列表赋值时,视图没有更新的解决方案

    在Vue 3.0 中我们使用 reactive() 定义的响应式数据的时候,当是一个数组或对象时,我们直接进行赋值,发现数据已经修改成功,但是页⾯并没有自动渲染成最新的数据;这是为什么呢? 就如同官网所说的reactive存在一些 局限性 :(官方的描述) 原因就是reactive函数会返回一个

    2024年02月13日
    浏览(55)
  • 【Vue3响应式原理#01】Reactivity

    专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核💪推荐🙌 欢迎各位ITer关注点赞收藏🌸🌸🌸 以下是柏成根据Vue3官方课程整理的响应式书面文档 - 第一节,课程链接在此:Vue 3 Reactivity - Vue 3 Reactivity | Vue Mastery,本文档可作为课程的辅助材料,

    2024年02月08日
    浏览(38)
  • 【Vue3响应式入门#01】Reactivity

    专栏分享:vue2源码专栏,vue3源码专栏,vue router源码专栏,玩具项目专栏,硬核💪推荐🙌 欢迎各位ITer关注点赞收藏🌸🌸🌸 以下是柏成根据Vue3官方课程整理的响应式书面文档 - 第一节,课程链接在此:Vue 3 Reactivity - Vue 3 Reactivity | Vue Mastery,本文档可作为课程的辅助材料,

    2024年02月08日
    浏览(45)
  • vue3-响应式基础之reactive

    reactive() 还有另一种声明响应式状态的方式,即使用 reactive() API。与将内部值包装在特殊对象中的 ref 不同,reactive() 将使对象本身具有响应性: 「点击按钮+1」 「示例效果」 响应式对象是 JavaScript 代理,其行为就和普通对象一样。不同的是,Vue 能够拦截对响应式对象所有属

    2024年01月16日
    浏览(45)
  • Vue3 reactive丢失响应式问题

    问题描述: 使用 reactive 定义的对象,重新赋值后失去了响应式,改变值视图不会发生变化。 测试代码: 输出结果:   从上述测试代码中,ref 定义的对象有响应式,而 reactive 定义的对象失去了响应式,这是什么原因呢?官网中写到: 如果将一个对象赋值给 ref ,那么这个对

    2024年02月05日
    浏览(39)
  • Vue3中reactive响应式失效的问题

    弹窗内部有一个挑选框,要通过请求接口获取挑选框下面可供选择的数据。 这是一个很简单的情境,我立刻有了自己的思路。如果实现搜索,数据较少可以直接用elementplus自带的filter。如果数据较多,就需要传val,在后台进行搜索,然后分页渲染。我选择的是前者,所以只需

    2024年02月10日
    浏览(36)
  • 前端Vue篇之Vue3响应式:Ref和Reactive

    在Vue3中,响应式编程是非常重要的概念,其中 Ref 和 Reactive 是两个关键的API。 Ref : Ref 用于创建一个响应式的基本数据类型,比如数字、字符串等。它将普通的数据变成响应式数据,可以监听数据的变化。使用 Ref 时,我们可以通过 .value 来访问和修改数据的值。 Reactive :

    2024年04月25日
    浏览(48)
  • vue3 reactive包裹数组无法页面无法响应式

    原代码如下: 此时removeItem方法运行,打印出historyAccount的值确实被改变了,但是页面还是没有变化 原因: 如果你直接通过赋值的方式改变 reactive 对象引用的数组,是不会触发视图的更新的,应该使用 Vue 提供的响应式方法来更新响应式数据。  改进:可以利用splice方法删除

    2024年04月09日
    浏览(44)
  • vue3 ref reactive响应式数据 赋值的问题

    doing 遇见就记录,最后更新时间23.8.30 错误示范:直接赋值 以数组为例,对象也是一样的操作。 ref 定义的属性等价于 reactive({value:xxx}) ,所以 reactive、ref 直接重新赋值丢失响应是因为引用地址变了 正确写法 方法1: ref.value ,代码中更为清晰地表明响应式数据 方法2:包一层

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包