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

React?中hooks之?React.memo?和?useMemo用法示例總結(jié)

 更新時間:2025年01月23日 14:22:34   作者:傻小胖  
React.memo是一個高階組件,用于優(yōu)化函數(shù)組件的性能,通過記憶組件渲染結(jié)果來避免不必要的重新渲染,合理使用React.memo和useMemo可以顯著提升React應(yīng)用的性能,本文介紹React?中hooks之?React.memo?和?useMemo用法總結(jié),感興趣的朋友一起看看吧

1. React.memo 基礎(chǔ)

React.memo 是一個高階組件(HOC),用于優(yōu)化函數(shù)組件的性能,通過記憶組件渲染結(jié)果來避免不必要的重新渲染。

1.1 基本用法

const MemoizedComponent = React.memo(function MyComponent(props) {
  /* 渲染邏輯 */
});

只有props發(fā)生變化才會重新渲染MemoizedComponent

1.2 帶有比較函數(shù)的用法

const MemoizedComponent = React.memo(MyComponent, (prevProps, nextProps) => {
  // 返回 true 表示不需要重新渲染
  // 返回 false 表示需要重新渲染
  return prevProps.id === nextProps.id;
});

2. React.memo 使用場景

2.1 純展示組件

const ExpensiveComponent = React.memo(function ExpensiveComponent({ data }) {
  // 復(fù)雜的渲染邏輯
  return (
    <div>
      {data.map(item => (
        <div key={item.id}>
          <h3>{item.title}</h3>
          <p>{item.description}</p>
        </div>
      ))}
    </div>
  );
});
// 父組件
function ParentComponent() {
  const [count, setCount] = useState(0);
  const data = [/* 大量數(shù)據(jù) */];
  return (
    <div>
      <button onClick={() => setCount(c => c + 1)}>
        Count: {count}
      </button>
      <ExpensiveComponent data={data} />
    </div>
  );
}

2.2 列表項組件

const ListItem = React.memo(function ListItem({ item, onItemClick }) {
  console.log(`Rendering item ${item.id}`);
  return (
    <li onClick={() => onItemClick(item.id)}>
      {item.name}
    </li>
  );
});
function List({ items }) {
  const [selectedId, setSelectedId] = useState(null);
  // 使用 useCallback 來記憶回調(diào)函數(shù)
  const handleItemClick = useCallback((id) => {
    setSelectedId(id);
  }, []);
  return (
    <ul>
      {items.map(item => (
        <ListItem
          key={item.id}
          item={item}
          onItemClick={handleItemClick}
        />
      ))}
    </ul>
  );
}

3. useMemo 基礎(chǔ)

useMemo 是一個 Hook,用于記憶計算結(jié)果,避免在每次渲染時重復(fù)進行昂貴的計算。

3.1 基本用法

const memoizedValue = useMemo(() => {
  // 進行計算并返回結(jié)果
  return computeExpensiveValue(a, b);
}, [a, b]); // 依賴項數(shù)組,空數(shù)組時只有初始化的時候執(zhí)行,沒有依賴參數(shù)項state每次變化都會引起重新執(zhí)行,有依賴數(shù)組室,依賴數(shù)據(jù)發(fā)生變化才會觸發(fā)重新執(zhí)行

4. useMemo 使用場景

4.1 昂貴的計算

function DataAnalytics({ data }) {
  const processedData = useMemo(() => {
    // 假設(shè)這是一個復(fù)雜的數(shù)據(jù)處理函數(shù)
    return data.map(item => ({
      ...item,
      processed: expensiveOperation(item)
    }));
  }, [data]); // 只在 data 改變時重新計算
  return (
    <div>
      {processedData.map(item => (
        <div key={item.id}>{item.processed}</div>
      ))}
    </div>
  );
}

4.2 避免子組件不必要的重新渲染

function ParentComponent({ items }) {
  // 記憶對象或數(shù)組類型的 props
  const memoizedValue = useMemo(() => ({
    data: items,
    config: {
      sortBy: 'name',
      filterBy: 'active'
    }
  }), [items]);
  return <ChildComponent options={memoizedValue} />;
}

4.3 復(fù)雜對象的派生狀態(tài)

function UserDashboard({ user, transactions }) {
  // 計算用戶統(tǒng)計信息
  const userStats = useMemo(() => {
    return {
      totalSpent: transactions.reduce((sum, t) => sum + t.amount, 0),
      averageSpent: transactions.length
        ? transactions.reduce((sum, t) => sum + t.amount, 0) / transactions.length
        : 0,
      mostFrequentCategory: calculateMostFrequentCategory(transactions)
    };
  }, [transactions]);
  return (
    <div>
      <UserInfo user={user} />
      <UserStatistics stats={userStats} />
    </div>
  );
}

5. 性能優(yōu)化最佳實踐

5.1 合理使用 React.memo

// ? 好的使用場景:純組件,props 很少改變
const PureComponent = React.memo(function PureComponent({ data }) {
  return <div>{/* 渲染邏輯 */}</div>;
});
// ? 不好的使用場景:props 經(jīng)常變化
const FrequentlyChangingComponent = React.memo(function FrequentlyChangingComponent({ date }) {
  return <div>{date.toLocaleTimeString()}</div>;
});

5.2 合理使用 useMemo

// ? 好的使用場景:計算開銷大
const expensiveValue = useMemo(() => {
  return someExpensiveOperation(props.data);
}, [props.data]);
// ? 不好的使用場景:計算開銷小
const simpleValue = useMemo(() => {
  return props.value + 1;
}, [props.value]); // 這種情況直接計算即可

5.3 配合 useCallback 使用

function SearchComponent({ onSearch }) {
  const [query, setQuery] = useState('');
  // 記憶回調(diào)函數(shù)
  const handleSearch = useCallback(() => {
    onSearch(query);
  }, [query, onSearch]);
  // 記憶計算結(jié)果
  const searchResults = useMemo(() => {
    return performExpensiveSearch(query);
  }, [query]);
  return (
    <div>
      <input
        value={query}
        onChange={e => setQuery(e.target.value)}
      />
      <button onClick={handleSearch}>搜索</button>
      <ResultsList results={searchResults} />
    </div>
  );
}
// 使用 React.memo 優(yōu)化 ResultsList
const ResultsList = React.memo(function ResultsList({ results }) {
  return (
    <ul>
      {results.map(result => (
        <li key={result.id}>{result.title}</li>
      ))}
    </ul>
  );
});

6. 注意事項

不要過度優(yōu)化

  • 只在真正需要的地方使用 memo 和 useMemo
  • 性能測量驗證優(yōu)化效果

依賴項的正確使用

  • 確保依賴項數(shù)組包含所有需要的值
  • 避免依賴項過多導(dǎo)致優(yōu)化失效

避免在循環(huán)中使用 useMemo

// ? 錯誤示例
{items.map(item => {
  const memoizedValue = useMemo(() => compute(item), [item]);
  return <div>{memoizedValue}</div>;
})}

考慮內(nèi)存使用

  • memo 和 useMemo 會占用額外的內(nèi)存
  • 在內(nèi)存受限的環(huán)境中要謹慎使用

7. 性能優(yōu)化決策流程

  • 首先評估是否真的需要優(yōu)化
  • 使用 React DevTools Profiler 識別性能問題
  • 選擇合適的優(yōu)化策略:
    • 組件重新渲染優(yōu)化:使用 React.memo
    • 計算結(jié)果優(yōu)化:使用 useMemo
    • 回調(diào)函數(shù)優(yōu)化:使用 useCallback
  • 測試優(yōu)化效果
  • 持續(xù)監(jiān)控性能

通過合理使用 React.memo 和 useMemo,我們可以顯著提升 React 應(yīng)用的性能。但記住,過度優(yōu)化可能會適得其反,應(yīng)該在實際需要時才進行優(yōu)化。

到此這篇關(guān)于React 中hooks之 React.memo 和 useMemo用法總結(jié)的文章就介紹到這了,更多相關(guān)React React.memo 和 useMemo內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • React事件綁定詳解

    React事件綁定詳解

    這篇文章主要為大家介紹了React事件綁定,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • React、Vue中key的作用詳解 (key的內(nèi)部原理解析)

    React、Vue中key的作用詳解 (key的內(nèi)部原理解析)

    key是虛擬DOM對象的標識,當狀態(tài)中的數(shù)據(jù)發(fā)生變化時,Vue會根據(jù)[新數(shù)據(jù)]生成[新的虛擬DOM],本文給大家介紹React、Vue中key的作用詳解 (key的內(nèi)部原理解析),感興趣的朋友一起看看吧
    2023-10-10
  • react?路由權(quán)限動態(tài)菜單方案配置react-router-auth-plus

    react?路由權(quán)限動態(tài)菜單方案配置react-router-auth-plus

    這篇文章主要為大家介紹了react路由權(quán)限動態(tài)菜單方案react-router-auth-plus傻瓜式配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • 如何使用 electron-forge 搭建 React + Ts 的項目

    如何使用 electron-forge 搭建 React + Ts&n

    本文介紹了如何使用Electron、electron-forge、webpack、TypeScript、React和SCSS等技術(shù)搭建一個桌面應(yīng)用程序,通過這篇文章,開發(fā)者可以創(chuàng)建一個包含React組件、SCSS樣式、靜態(tài)資源和Loading頁面的應(yīng)用,感興趣的朋友一起看看吧
    2025-01-01
  • react實現(xiàn)數(shù)據(jù)監(jiān)聽方式

    react實現(xiàn)數(shù)據(jù)監(jiān)聽方式

    這篇文章主要介紹了react實現(xiàn)數(shù)據(jù)監(jiān)聽方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vite搭建React項目的方法步驟

    Vite搭建React項目的方法步驟

    這篇文章主要介紹了Vite搭建React項目的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • React 使用Hooks簡化受控組件的狀態(tài)綁定

    React 使用Hooks簡化受控組件的狀態(tài)綁定

    這篇文章主要介紹了React 使用Hooks簡化受控組件的狀態(tài)綁定,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • React中父子組件通信詳解

    React中父子組件通信詳解

    這篇文章主要介紹了React中父子組件通信詳解,在父組件中,為子組件添加屬性數(shù)據(jù),即可實現(xiàn)父組件向子組件通信,文章通過圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • React?中state與props更新深入解析

    React?中state與props更新深入解析

    這篇文章主要為大家介紹了React?中state與props更新深入解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-11-11
  • react-native動態(tài)切換tab組件的方法

    react-native動態(tài)切換tab組件的方法

    在APP中免不了要使用tab組件,有的是tab切換,也有的是tab分類切換.這篇文章主要介紹了react-native動態(tài)切換tab組件的方法,非常具有實用價值,需要的朋友可以參考下
    2018-07-07

最新評論

谷城县| 陇西县| 纳雍县| 普兰店市| 江华| 新沂市| 乌鲁木齐市| 邻水| 秭归县| 手机| 新昌县| 麻栗坡县| 尤溪县| 吐鲁番市| 长沙县| 龙州县| 朝阳区| 安乡县| 河北区| 萍乡市| 兴义市| 临西县| 伽师县| 台前县| 日土县| 鄂伦春自治旗| 黄浦区| 康乐县| 吉木乃县| 南城县| 金川县| 镇康县| 商南县| 仁布县| 台南县| 水富县| 泰宁县| 小金县| 上蔡县| 宝应县| 克东县|