【Vue3】vue3快速实现响应式数据恢复初始值。浅拷贝与深拷贝的应用。

news2024/12/23 14:02:50

有一个经常遇到的场景就是,一个表单最后一列有个编辑按钮,点击编辑按钮之后打开表单弹窗,修改其中的数据,但是如果此弹窗再作为新增弹窗打开的时候,弹窗数据会缓存上次编辑的数据。

在这里插入图片描述

在 Vue 3 中,由于引入了新的响应式系统,重置数据到初始值的方法与 Vue 2 不同。当你使用 reactive 创建响应式对象时,一个常见做法是保留初始数据的引用,以便在需要时恢复数据。对于使用 reactive 或 ref 创建的响应式数据,可以采取以下方法来恢复到初始值:

方法一:直接赋值

在每次关闭弹窗的时候,手动给reactive的所有子项赋初始值。
缺点是对于复杂数据手动赋值很麻烦

const state = reactive({
	name:'',
	age: ''
});

// 关闭弹窗
const closeDialog = () => {
	state.dialog.isShowDialog = false;
	state.name = '';
	state.age = '';
};

方法二:使用类

网友提供的方法,感觉比较优雅

import { ref, reactive } from 'vue';

class State{
 username = '',
 password = ''
}

// new state()是一个新实例,除此合并之外无其它引用,无需担心浅复制引用问题
const state = reactive(new State());
Object.assign(state, new State());

// Prefect
const stateRef = ref(new state());
stateRef.value = new state();

方法三:使用函数(推荐)

直接使用函数实现,每次重置的时候调用函数即可

const initData = () => ({
	name:'',
	age: ''
});
const state: any = reactive(initData());

// 重置弹窗
const resetData = () => {
	Object.assign(state, initData());
};

方法四:浅拷贝与深拷贝

Object.assign 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它是一个浅拷贝,意味着它只会拷贝源对象的属性值。
如果源对象的属性值是对象或其他引用类型的值,则目标对象会保存这些值的引用。

浅拷贝示例:

let obj1 = { 
	a: 1, 
	b: { c: 2 } 
};
let obj2 = Object.assign({}, obj1);
 
console.log(obj2); // { a: 1, b: { c: 2 } }
 
obj1.a = 3;
obj1.b.c = 4;
 
console.log(obj2); // { a: 1, b: { c: 4 } }, 因为b是引用类型,所以obj2.b也被改变了

使用浅拷贝重置数据只适用于一层的简单数据,对于引用类型的数据是无效的

如果需要进行深拷贝,即复制对象内部的所有嵌套对象,可以使用其他方法,如使用JSON.parse(JSON.stringify())、手写递归函数或使用第三方库(如 lodash 的_.cloneDeep)。

深拷贝示例:

let obj1 = { a: 1, b: { c: 2 } };
 
// 使用JSON.parse(JSON.stringify())进行深拷贝
let obj2 = JSON.parse(JSON.stringify(obj1));
 
obj1.a = 3;
obj1.b.c = 4;
 
console.log(obj2); // { a: 1, b: { c: 2 } }, obj2未受obj1的修改影响

注意:JSON.parse(JSON.stringify()) 在处理包含循环引用或不可序列化属性的对象时可能会出错。因此,它不是进行深拷贝的最佳选择。使用深拷贝可以解决响应式数据恢复初始值的问题,但是要注意深拷贝的具体实现。

最佳实践:structuredClone

在现代浏览器中,可以使用 structuredClone 方法来实现深拷贝,它是一种更高效、更安全的深拷贝方式。
以下是一个示例代码,演示如何使用 structuredClone 进行深拷贝:

const kitchenSink = {
  set: new Set([1, 3, 3]),
  map: new Map([[1, 2]]),
  regex: /foo/,
  deep: { array: [ new File(someBlobData, 'file.txt') ] },
  error: new Error('Hello!')
}
kitchenSink.circular = kitchenSink

const clonedSink = structuredClone(kitchenSink)

structuredClone可以做到:

  • 拷贝无限嵌套的对象和数组
  • 拷贝循环引用
  • 拷贝各种各样的JavaScript类型,如Date、Set、Map、Error、RegExp、ArrayBuffer、Blob、File、ImageData等

哪些不能拷贝:

  • 函数
  • DOM节点
  • 属性描述、setter和getter
  • 对象原型链

structuredClone浏览器兼容性
实践:

const initData = {
	name:'',
	age: '',
	house: {
		size: '',
		height: ''
	}
};
const state: any = reactive(initData);

// 直接保存一份原始数据
// const sourceData = JSON.parse(JSON.stringify(state));
// 本文写到这里的时候,我才发现这个函数对于这篇文章的需求没啥用,proxy代理了,structuredClone不支持函数克隆,为啥我不一开始直接搞个变量存初始化数据呢?哈哈哈哈
const sourceData = structuredClone(state);  // 会报错其实

// 重置弹窗
const resetData = () => {
	state = sourceData;
};

对于赋值失败的情况

如果遇到重置数据后仍然保持了输入的数据,可能的原因有几种,这里提供一些排查和解决的建议:

确保没有引用问题:如果你在重置时直接修改了引用类型的字段(如数组或对象内部的属性),而这些字段在其他地方也被引用,那么更改可能不会如预期反映出来。确保你是正确地替换整个引用,或者深拷贝后再赋值。

异步更新问题:Vue 3 中,状态改变后,DOM 的更新可能是异步的。如果你在重置状态后立即检查 DOM 或状态,可能会看到旧的值。可以使用 nextTick 确保 DOM 已更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1794493.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言二级指针、指针数组

一、二级指针 指针变量也是变量,是变量就应有地址,那指针变量的地址存放在哪里?存放在二级指针变量。 此时,*ppa pa,**ppa a。 二、指针数组 指针数组,顾名思义就是存放指针的数组。 数组每个元素为int类…

java自学阶段二:JavaWeb开发45(git学习)

目录: 学习目标git的使用(工作流程、常用命令、idea集成) 一、学习目标: 了解Git基本概念能够了解git的工作流程能够使用Git常用命令熟悉Git代码托管服务能够使用idea操作git 二、git的使用 1)git的概念&#xff1…

学校教学选择SOLIDWORKS教育版的理由

在现代工程和技术教育领域中,计算机辅助设计软件(CAD)已成为不可或缺的教学工具。SOLIDWORKS作为一款功能强大、易于上手的CAD软件,其教育版在学校教学中备受青睐。本文将从多个方面探讨学校教学选择SOLIDWORKS教育版的理由。 一…

堪称2024最强的前端面试场景题,让419人成功拿到offer

前言 2024年的秋季招聘还有两个月就即将到来,很多同学开始思考前端面试中场景题的重要性。这里我提供一些见解和建议来帮助大家准备即将到来的面试。 首先,理解面试中场景题的必要性是至关重要的。与算法或理论问题不同,场景题更贴近实际工…

Linux系统推出VB6开发IDE了?Gambas,Linux脚本编写

第一个Linux程序,加法计算加弹窗对话框,Gambas,linux版的类似VB6的IDE开发环境 一开始想用VB6的Clng函数转成整数,没这函数。 输入3个字母才有智能提示,这点没做好 没有msgbox函数,要用messagebox.warning 如果可以添加函数别名就…

设计软件有哪些?效果工具篇(1),渲染100邀请码1a12

设计师会用到很多渲染效果和后期处理的工具,这里我们介绍一些。 1、AfterBurn AfterBurn是为Autodesk 3ds Max开发的专业级别的体积照明和效果插件。它提供了一系列强大的特效功能,包括烟雾、火焰、云彩等。用户可以利用AfterBurn创建逼真的环境效果&a…

18 - 各赛事的用户注册率(高频 SQL 50 题基础版)

18 - 各赛事的用户注册率 -- 注册率注册用户数/所有用户数 selectr.contest_id,round(100*count(*)/(select count(*) from Users),2) percentage from Register r group by r.contest_id order bypercentage desc,r.contest_id ASC;

破解App推广难题,Xinstall地推助手APP助你轻松触达海量用户

在日新月异的互联网环境中,App推广和运营面临着前所未有的挑战。流量红利逐渐衰退,用户获取成本不断攀升,如何迅速搭建起能满足用户需求的运营体系,成为众多企业亟待解决的问题。今天,我们将为大家介绍一款能够轻松解决…

Java中CAS机制详解

文章目录 概述CAS的基本概念CAS基本原理Java中的CAS实现什么是unsafe原子操作类解析 CAS机制的优缺点优点缺点 CAS应用场景CAS机制优化总结 概述 传统的并发控制手段,如使用synchronized关键字或者ReentrantLock等互斥锁机制,虽然能够有效防止资源的竞争…

参数传递和剪枝,从修剪二叉树谈起

669. 修剪二叉搜索树 - 力扣(LeetCode) 一、参数传递 Java中的参数传递方式只有一种,那就是值传递。如果我们传的是基本数据类型,那么函数接收到的就是该数据的副本,如果我们传的是对象,那么函数接收到的就…

Fortigate防火墙二层接口的几种实现方式

初始配置 FortiGate出厂配置默认地址为192.168.1.99(MGMT接口),可以通过https的方式进行web管理(默认用户名admin,密码为空),不同型号设备用于管理的接口略有不同。 console接口的配置 防火墙…

ubuntu certbot 生成https ssl证书

一、安装certbot应用 sudo apt update sudo apt install certbot python3-certbot-nginx二、生成证书 # 泛域名: certbot certonly -d *.你的主域名 --manual --preferred-challenges dns# 主域名: certbot certonly -d 你的主/子域名 --manual --pref…

单轴测径仪和双轴测径仪的区别

关键字:单轴测径仪、双轴测径仪、单轴双轴的结构差异、功能区别、应用场景、测量精度、测头、外径尺寸检测、 单轴测径仪和双轴测径仪在多个方面存在显著的区别,这些区别主要体现在其结构、功能、应用场景以及测量精度上。 首先,从结构上来…

水经微图IOS版5.3.0发布

随时随地,微图一下! 水经微图(以下简称“微图”)IOS版,新版已上线。 当前版本 当前版本号为:5.3.0-beta 如果你发现该版本中存在问题,请及时反馈给我们修订。 关于我们产品的版本控制&…

猫毛过敏终极解决神器,使用宠物空气净化器享受快乐撸猫~

作为一位经验丰富的宠物主人,与猫咪共度的时光确实充满了乐趣。但是,猫毛和皮屑对某些人来说可能会成为头疼的问题,引发过敏症状,例如打喷嚏、流鼻涕,甚至呼吸急促。这些反应不仅会干扰宠物主人的日常生活,…

PPINtonus (深度学习音调分析)帕金森病早期检测系统

帕金森病(Parkinson’s Disease,简称PD)是一种主要影响运动功能的进行性神经退行性疾病。这种疾病主要是由于大脑中一个名为黑质(substantia nigra)的区域失去产生多巴胺的神经元而引起的。PD的主要运动症状包括震颤、…

C++笔试强训day40

目录 1.游游的字母串 2.体育课测验(二) 3.合唱队形 1.游游的字母串 链接https://ac.nowcoder.com/acm/problem/255195 英文字母一共就26个&#xff0c;因此可以直接暴力枚举以每个字母作为最后的转变字母。最后去最小值即可 #include <iostream> #include <cmath&…

商淘云电商分账系统如何为企业降低连锁财务成本

当今激烈的市场竞争中&#xff0c;连锁品牌企业面临着多样化的挑战&#xff0c;其中财务管理尤为关键。商淘云连锁收银系统作为一款专为连锁品牌量身定制的解决方案&#xff0c;不仅可以帮助企业实现总部入账管控财务、银行结算规范财务的目标&#xff0c;还能通过分账系统优化…

Linux系统安装APITable详细流程与远程访问本地平台数据分析

文章目录 前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 &#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 前言 v…

揭秘智能测径仪省钱之道!每年能为每条产线省上百万!

在当今竞争激烈的市场环境下&#xff0c;企业们都在不断寻求提高生产效率、降低成本的方法。而智能测径仪的出现&#xff0c;为圆形钢材、螺纹钢等生产企业实现这一目标提供了有力的支持。 智能测径仪被广泛应用于高线、铸管、圆钢、螺纹钢、钢筋等的轧制生产线中&#xff0c;进…