react hooks深拷贝后无法保留视图状态

简介: react hooks深拷贝后无法保留视图状态

在使用useState做数据操作更新的时候,有一些复杂数据类型,一个对象数组里包含,函数,dom等等复杂数据类型,想要进行数据更新,并且视图更新的情况下,因useState的特性就必须进行深拷贝赋值。

方式
1、JSON.stringify配合JSON.parse 这个有限制,我们的数据类型包含,函数。它会丢失
2、Lodash 里的深拷贝方法
3、递归实现

我这里通过递归直接写的方法,发现拷贝是可以了,但是无法保留之前dom上的视图状态看,查阅文档如下

React Hooks 是 React 的一种新特性,它提供了一种更加方便和简洁的方式来编写组件。React Hooks 中的 state 和 props 都是可变的,当组件的状态或属性发生改变时,React 会重新渲染组件。在进行深拷贝时,只是将组件的 state 或 props 对象中的值复制到了一个新的对象中,新的对象和原来的对象是完全独立的,它们的引用关系已经被断开。而 React 在进行组件渲染时,是根据组件的 state 和 props 来计算出组件的视图状态的,当组件的 state 或 props 发生改变时,React 会重新计算组件的视图状态,并重新渲染组件。

因此,如果在进行深拷贝后,将新的对象作为组件的 state 或 props,那么组件的视图状态就会丢失,因为 React 认为组件的状态或属性并没有发生改变,所以不会重新计算组件的视图状态。要保留组件的视图状态,需要确保深拷贝后的对象和原来的对象具有相同的引用关系,或者使用其他方法来进行状态管理,例如使用 React Context 或 Redux 等状态管理库。

解决
我这里是找了一个npm包来处理了

首先,我们需要安装一个不可变数据结构库,这里我选择使用Immer。您可以使用以下命令进行安装:

npm install immer
然后,我们可以使用Immer来创建一个新的状态对象,而不必担心丢失与原始状态相关联的视图状态。下面是一个示例:
如图:
image.png

代码:

import React, {
    useState } from 'react';
import produce from 'immer';

function MyComponent() {
   
  const [data, setData] = useState({
    
    name: 'John',
    age: 30,
    address: {
   
      city: 'New York',
      country: 'USA'
    }
  });

  const handleButtonClick = () => {
   
    const newData = produce(data, draftData => {
   
      draftData.age = 31;
      draftData.address.city = 'Los Angeles';
    });
    setData(newData);
  };

  return (
    <div>
      <p>Name: {
   data.name}</p>
      <p>Age: {
   data.age}</p>
      <p>City: {
   data.address.city}</p>
      <p>Country: {
   data.address.country}</p>
      <button onClick={
   handleButtonClick}>Update</button>
    </div>
  );
}

在上面的示例中,我们使用了Immer的produce方法来创建一个新的状态对象newData,并在其中更新了age和address.city属性。然后,我们使用setData方法将新的状态对象设置为组件的状态。由于我们使用了不可变数据结构,与原始状态相关联的视图状态将不会丢失。

请注意,我们在handleButtonClick方法中使用了produce方法来创建新的状态对象。produce方法将原始状态对象data作为第一个参数,并接受一个回调函数作为第二个参数。在回调函数中,我们可以使用类似于修改原始状态对象的方式来修改draftData对象,但实际上我们是在修改新的状态对象。最后,produce方法将返回一个新的状态对象newData,该对象包含所有更改。

我这里试过是ok的

目录
相关文章
|
2月前
|
前端开发 JavaScript
React Hooks 全面解析
【10月更文挑战第11天】React Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性,简化了状态管理和生命周期管理。本文从基础概念入手,详细介绍了 `useState` 和 `useEffect` 的用法,探讨了常见问题和易错点,并提供了代码示例。通过学习本文,你将更好地理解和使用 Hooks,提升开发效率。
70 4
|
2月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
19天前
|
前端开发 JavaScript
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
|
29天前
|
前端开发 JavaScript 开发者
“揭秘React Hooks的神秘面纱:如何掌握这些改变游戏规则的超能力以打造无敌前端应用”
【10月更文挑战第25天】React Hooks 自 2018 年推出以来,已成为 React 功能组件的重要组成部分。本文全面解析了 React Hooks 的核心概念,包括 `useState` 和 `useEffect` 的使用方法,并提供了最佳实践,如避免过度使用 Hooks、保持 Hooks 调用顺序一致、使用 `useReducer` 管理复杂状态逻辑、自定义 Hooks 封装复用逻辑等,帮助开发者更高效地使用 Hooks,构建健壮且易于维护的 React 应用。
32 2
|
2月前
|
前端开发 开发者
React 提供的其他重要 Hooks
【10月更文挑战第20天】React 提供了一系列强大的 Hooks,除了 `useRef` 之外,还有许多其他重要的 Hooks,它们共同构成了函数式组件开发的基础。
35 6
|
11天前
|
缓存 前端开发 开发者
深入理解React Hooks,打造高效响应式UI
深入理解React Hooks,打造高效响应式UI
21 0
|
2月前
|
前端开发 JavaScript 开发者
React Hooks
10月更文挑战第13天
36 1
|
2月前
|
前端开发
|
2月前
|
前端开发 JavaScript API
自定义React Hooks综合指南
本文介绍了React Hooks及其在组件开发中的作用,重点讲解了自定义Hook的创建和使用方法。通过实例展示了如何创建`useWindowWidth`、`useFetch`和`useForm`等自定义Hook,并分享了使用自定义Hook的最佳实践。文章强调了自定义Hook在提高代码复用性和组件可维护性方面的重要性。
62 0
|
2月前
|
存储 前端开发 JavaScript
深入理解React组件的生命周期与Hooks
【10月更文挑战第7天】深入理解React组件的生命周期与Hooks
100 0