最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

react?hooks深拷貝后無法保留視圖狀態(tài)解決方法

 更新時間:2023年06月29日 11:11:34   作者:w晚風  
這篇文章主要為大家介紹了react?hooks深拷貝后無法保留視圖狀態(tài)解決示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

問題

在使用useState做數(shù)據(jù)操作更新的時候,有一些復(fù)雜數(shù)據(jù)類型,一個對象數(shù)組里包含,函數(shù),dom等等復(fù)雜數(shù)據(jù)類型,想要進行數(shù)據(jù)更新,并且視圖更新的情況下,因useState的特性就必須進行深拷貝賦值。

方式

1、JSON.stringify配合JSON.parse 這個有限制,我們的數(shù)據(jù)類型包含,函數(shù)。它會丟失

2、Lodash 里的深拷貝方法

3、遞歸實現(xiàn)

我這里通過遞歸直接寫的方法,發(fā)現(xiàn)拷貝是可以了,但是無法保留之前dom上的視圖狀態(tài)看,查閱文檔如下

React Hooks 是 React 的一種新特性,它提供了一種更加方便和簡潔的方式來編寫組件。React Hooks 中的 state 和 props 都是可變的,當組件的狀態(tài)或?qū)傩园l(fā)生改變時,React 會重新渲染組件。在進行深拷貝時,只是將組件的 state 或 props 對象中的值復(fù)制到了一個新的對象中,新的對象和原來的對象是完全獨立的,它們的引用關(guān)系已經(jīng)被斷開。而 React 在進行組件渲染時,是根據(jù)組件的 state 和 props 來計算出組件的視圖狀態(tài)的,當組件的 state 或 props 發(fā)生改變時,React 會重新計算組件的視圖狀態(tài),并重新渲染組件。

因此,如果在進行深拷貝后,將新的對象作為組件的 state 或 props,那么組件的視圖狀態(tài)就會丟失,因為 React 認為組件的狀態(tài)或?qū)傩圆]有發(fā)生改變,所以不會重新計算組件的視圖狀態(tài)。要保留組件的視圖狀態(tài),需要確保深拷貝后的對象和原來的對象具有相同的引用關(guān)系,或者使用其他方法來進行狀態(tài)管理,例如使用 React Context 或 Redux 等狀態(tài)管理庫。

解決

我這里是找了一個npm包來處理了

首先,我們需要安裝一個不可變數(shù)據(jù)結(jié)構(gòu)庫,這里我選擇使用Immer。您可以使用以下命令進行安裝:

npm install immer

然后,我們可以使用Immer來創(chuàng)建一個新的狀態(tài)對象,而不必擔心丟失與原始狀態(tài)相關(guān)聯(lián)的視圖狀態(tài)。下面是一個示例:

代碼

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方法來創(chuàng)建一個新的狀態(tài)對象newData,并在其中更新了age和address.city屬性。然后,我們使用setData方法將新的狀態(tài)對象設(shè)置為組件的狀態(tài)。由于我們使用了不可變數(shù)據(jù)結(jié)構(gòu),與原始狀態(tài)相關(guān)聯(lián)的視圖狀態(tài)將不會丟失。

請注意,我們在handleButtonClick方法中使用了produce方法來創(chuàng)建新的狀態(tài)對象。produce方法將原始狀態(tài)對象data作為第一個參數(shù),并接受一個回調(diào)函數(shù)作為第二個參數(shù)。在回調(diào)函數(shù)中,我們可以使用類似于修改原始狀態(tài)對象的方式來修改draftData對象,但實際上我們是在修改新的狀態(tài)對象。最后,produce方法將返回一個新的狀態(tài)對象newData,該對象包含所有更改。

我這里試過是ok的

以上就是react hooks深拷貝后無法保留視圖狀態(tài)解決方法的詳細內(nèi)容,更多關(guān)于react hooks深拷貝視圖狀態(tài)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • React狀態(tài)管理之Zustand的實現(xiàn)示例

    React狀態(tài)管理之Zustand的實現(xiàn)示例

    Zustand是一個輕量級的狀態(tài)管理庫,它提供了一種簡單而強大的方式來管理應(yīng)用的全局狀態(tài),同時避免了傳統(tǒng)狀態(tài)管理庫中的復(fù)雜性,下面就來詳細的介紹一下Zustand的使用,感興趣的可以了解一下
    2025-12-12
  • react中使用swiper的具體方法

    react中使用swiper的具體方法

    本篇文章主要介紹了react中使用swiper的具體方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • React Js 微信禁止復(fù)制鏈接分享禁止隱藏右上角菜單功能

    React Js 微信禁止復(fù)制鏈接分享禁止隱藏右上角菜單功能

    這篇文章主要介紹了React Js 微信禁止復(fù)制鏈接,分享,禁止隱藏右上角菜單的解決代碼,需要的朋友可以參考下
    2017-05-05
  • React特征Form?單向數(shù)據(jù)流示例詳解

    React特征Form?單向數(shù)據(jù)流示例詳解

    這篇文章主要為大家介紹了React特征Form?單向數(shù)據(jù)流示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • react實現(xiàn)點擊選中的li高亮的示例代碼

    react實現(xiàn)點擊選中的li高亮的示例代碼

    本篇文章主要介紹了react實現(xiàn)選中的li高亮的示例代碼,頁面上有很多個li,要實現(xiàn)點擊到哪個就哪個高亮。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • React如何將組件渲染到指定DOM節(jié)點詳解

    React如何將組件渲染到指定DOM節(jié)點詳解

    這篇文章主要給大家介紹了關(guān)于React如何將組件渲染到指定DOM節(jié)點的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。
    2017-09-09
  • React前端渲染優(yōu)化--父組件導(dǎo)致子組件重復(fù)渲染的問題

    React前端渲染優(yōu)化--父組件導(dǎo)致子組件重復(fù)渲染的問題

    本篇文章是針對父組件導(dǎo)致子組件重復(fù)渲染的優(yōu)化方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 使用useMutation和React Query發(fā)布數(shù)據(jù)demo

    使用useMutation和React Query發(fā)布數(shù)據(jù)demo

    這篇文章主要為大家介紹了使用useMutation和React Query發(fā)布數(shù)據(jù)demo,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • React實現(xiàn)下拉框的key,value的值同時傳送

    React實現(xiàn)下拉框的key,value的值同時傳送

    這篇文章主要介紹了React實現(xiàn)下拉框的key,value的值同時傳送方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • React源碼分析之useCallback與useMemo及useContext詳解

    React源碼分析之useCallback與useMemo及useContext詳解

    這篇文章主要介紹了React useCallback與useMemo及useContext源碼分析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-11-11

最新評論

平江县| 定南县| 揭东县| 松滋市| 柘荣县| 闽侯县| 界首市| 杭锦后旗| 吉隆县| 平邑县| 顺义区| 鸡东县| 南安市| 县级市| 高密市| 嘉黎县| 余姚市| 永春县| 余江县| 光泽县| 江西省| 九台市| 鄂伦春自治旗| 徐水县| 元氏县| 卢龙县| 榆中县| 灵寿县| 泸水县| 荥经县| 兖州市| 中山市| 睢宁县| 道真| 称多县| 东兴市| 昌都县| 逊克县| 华亭县| 永寿县| 卓尼县|