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

 更新时间:2023年06月29日 11:11:34   作者:w晚风  
这篇文章主要为大家介绍了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来创建一个新的状态对象,而不必担心丢失与原始状态相关联的视图状态。下面是一个示例:

代码

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的

以上就是react hooks深拷贝后无法保留视图状态解决方法的详细内容,更多关于react hooks深拷贝视图状态的资料请关注脚本之家其它相关文章!

相关文章

  • React和Vue的props验证示例详解

    React和Vue的props验证示例详解

    这篇文章主要介绍了React和Vue的props验证,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • React中异步数据更新不及时问题及解决

    React中异步数据更新不及时问题及解决

    这篇文章主要介绍了React中异步数据更新不及时问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-03-03
  • React项目中应用TypeScript的实现

    React项目中应用TypeScript的实现

    TypeScript通常都会依赖于框架,例如和vue、react 这些框架结合,本文就主要介绍了React项目中应用TypeScript的实现,分享给大家,具体如下:
    2021-09-09
  • 教你快速搭建 React Native 开发环境

    教你快速搭建 React Native 开发环境

    这篇文章主要介绍了搭建 React Native 开发环境的详细过程,本文通过图文指令给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • React中组件的this.state和setState的区别

    React中组件的this.state和setState的区别

    在React开发中,this.state用于初始化和读取组件状态,而setState()用于安全地更新状态,正确使用这两者对于管理React组件状态至关重要,避免性能问题和常见错误
    2024-09-09
  • 详细谈谈React中setState是一个宏任务还是微任务

    详细谈谈React中setState是一个宏任务还是微任务

    学过react的人都知道,setState在react里是一个很重要的方法,使用它可以更新我们数据的状态,下面这篇文章主要给大家介绍了关于React中setState是一个宏任务还是微任务的相关资料,需要的朋友可以参考下
    2021-09-09
  • React配置代理服务器的5种方法及使用场景

    React配置代理服务器的5种方法及使用场景

    这篇文章主要介绍了React配置代理服务器的5种方法,无论使用哪种方法,都需要确保代理服务器的地址和端口正确,并且在配置完成后重新启动React开发服务器,使配置生效,需要的朋友可以参考下
    2023-08-08
  • React实现图片懒加载的常见方式

    React实现图片懒加载的常见方式

    图片懒加载是一种优化网页性能的技术,它允许在用户滚动到图片位置之前延迟加载图片,通过懒加载,可以在用户需要查看图片时才加载图片,避免了不必要的图片加载,本文给大家介绍了React实现图片懒加载的常见方式,需要的朋友可以参考下
    2024-01-01
  • 学习React中ref的两个demo示例

    学习React中ref的两个demo示例

    这篇文章主要介绍了学习React中ref的两个demo示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • React全家桶环境搭建过程详解

    React全家桶环境搭建过程详解

    本篇文章主要介绍了React全家桶环境搭建过程详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05

最新评论