成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

面試官:useSelector 返回的一個 state 數據很大,這個要怎么優(yōu)化

開發(fā)
如果 useSelector 返回的 state 數據很大,可能會導致 不必要的組件重新渲染,影響性能。優(yōu)化方式主要有以下幾種。

如果 useSelector 返回的 state 數據很大,可能會導致 不必要的組件重新渲染,影響性能。優(yōu)化方式主要有以下幾種:

1. 精確選擇數據,避免返回整個對象

錯誤做法(返回整個 state 對象):

const bigData = useSelector(state => state.bigData);

問題:任何 state.bigData 內部的字段變化都會觸發(fā)組件重新渲染,即使組件只用到其中一部分數據。

正確做法(只選擇需要的字段):

const someValue = useSelector(state => state.bigData.someValue);

優(yōu)勢:組件只會在 someValue 變化時重新渲染,而不會因 bigData 的其他字段變化而重新渲染。

2. 使用 reselect 進行 Memoization

如果計算 state 需要進行復雜的計算(如 filter、map 等),可以使用 reselect 緩存計算結果。

安裝 reselect:

npm install reselect

創(chuàng)建 selector:

import { createSelector } from "reselect";

// 原始數據選擇器
const selectBigData = state => state.bigData;

// 計算派生數據
export const selectFilteredData = createSelector(
  [selectBigData],
  bigData => bigData.filter(item => item.active) // 只返回 active 狀態(tài)的數據
);

組件中使用 selector:

import { useSelector } from "react-redux";
import { selectFilteredData } from "./selectors";

const MyComponent = () => {
  const filteredData = useSelector(selectFilteredData);

  return <div>{filteredData.length}</div>;
};

優(yōu)勢:createSelector 只有在 state.bigData 變化時才會 重新計算,否則返回緩存結果。

避免不必要的計算,提升性能。

3. useSelector 第二個參數 equalityFn 自定義比較

默認情況下,useSelector 使用 淺比較(===) 來判斷狀態(tài)是否變化。如果 state 是 深層對象,可以使用 自定義比較函數 進行優(yōu)化。

默認 useSelector(淺比較,可能會導致不必要的渲染):

const data = useSelector(state => state.bigData); // 任何字段變化都會重新渲染

使用 shallowEqual 進行淺層對比:

import { shallowEqual, useSelector } from "react-redux";

const data = useSelector(state => state.bigData, shallowEqual);

優(yōu)勢:shallowEqual 僅在 bigData 的 頂層字段 發(fā)生變化時才觸發(fā)組件重新渲染。

自定義 equalityFn(僅在 id 變化時更新):

const selectedItem = useSelector(
  state => state.bigData.find(item => item.id === 1),
  (prev, next) => prev.id === next.id // 只在 id 變化時重新渲染
);

優(yōu)勢:避免 bigData 其他字段變化時,導致不必要的重新渲染。

4. 拆分 state,減少 store 更新影響范圍

如果 bigData 很大,可以考慮拆分 store 結構,讓 Redux 多個 slice 管理不同部分的數據。

優(yōu)化前(單個 slice 存放大量數據):

const rootReducer = combineReducers({
  bigData: bigDataReducer
});

優(yōu)化后(拆分成多個 slice):

const rootReducer = combineReducers({
  users: usersReducer,
  products: productsReducer
});

組件按需獲取 state:

const users = useSelector(state => state.users);
const products = useSelector(state => state.products);

優(yōu)勢:避免 bigData 變化時,所有依賴 bigData 的組件都重新渲染。

5. 組件拆分,減少渲染范圍

如果 useSelector 獲取的數據很大,考慮 拆分組件,讓子組件只訂閱需要的數據。

錯誤示例(整個組件訂閱大數據):

const ParentComponent = () => {
  const bigData = useSelector(state => state.bigData);

  return (
    <div>
      {bigData.map(item => (
        <p key={item.id}>{item.name}</p>
      ))}
    </div>
  );
};

優(yōu)化示例(拆分成子組件,每個子組件獨立訂閱狀態(tài)):

const ListItem = ({ id }) => {
  const item = useSelector(state => state.bigData.find(i => i.id === id));
  return <p>{item.name}</p>;
};

const ParentComponent = () => {
  const itemIds = useSelector(state => state.bigData.map(i => i.id));

  return (
    <div>
      {itemIds.map(id => (
        <ListItem key={id} id={id} />
      ))}
    </div>
  );
};

優(yōu)勢:只有受影響的 ListItem 組件會重新渲染,而不是整個 ParentComponent。

6. 結合 useMemo 進行優(yōu)化

如果 useSelector 返回的數據需要復雜計算,可以用 useMemo 緩存結果,避免重復計算。

錯誤示例(計算邏輯直接在 useSelector 內部):

const filteredData = useSelector(state =>
  state.bigData.filter(item => item.active) // 每次都會重新計算
);

優(yōu)化示例(用 useMemo 緩存計算結果):

const data = useSelector(state => state.bigData);
const filteredData = useMemo(() => data.filter(item => item.active), [data]);

優(yōu)勢:useMemo 只有在 data 變化時才會重新計算,提高性能。

總結

優(yōu)化方法

思路

適用場景

1. 精確選擇數據

useSelector

 只返回 需要的字段,而不是整個 state

適用于 state 體積大、變化頻繁的情況

2. 使用 reselect

createSelector

 緩存計算結果,避免重復計算

適用于 依賴計算、列表過濾 場景

3. 自定義 equalityFn

只在 關鍵數據變化 時觸發(fā)渲染

適用于 深層數據結構

4. 拆分 state

將 state 拆成多個 slice,減少 store 影響范圍

適用于 大規(guī)模應用

5. 組件拆分

讓子組件獨立訂閱 state,避免父組件無意義渲染

適用于 列表渲染、大數據量場景

6. useMemo 緩存計算

避免 useSelector 內部重復計算

適用于 復雜計算

最終優(yōu)化思路:

  • 盡量讓 useSelector 只選擇最小數據。
  • 使用 reselect 避免不必要的計算。
  • 盡量拆分組件,減少不必要的渲染。

這樣可以讓 react-redux 更高效地更新 UI,提升應用性能!

責任編輯:趙寧寧 來源: 大遷世界
相關推薦

2025-03-05 00:00:00

2017-03-16 15:27:10

面試官測試技術

2022-01-10 11:04:41

單鏈表面試編程

2020-10-21 18:42:39

數據庫數據庫查詢分頁查詢

2022-04-08 08:26:03

JavaHTTP請求

2021-09-28 13:42:55

Chrome Devwebsocket網絡協議

2023-01-15 17:57:12

緩存技術kafka磁盤

2023-07-31 08:26:09

2020-05-13 14:35:47

HashMap面試官Java

2021-05-19 08:17:35

秒殺場景高并發(fā)

2022-08-18 20:02:04

JSLRU緩存

2020-06-22 07:47:46

提交面試官訂單

2021-06-09 07:55:19

NodeEventEmitte驅動

2025-06-04 03:15:00

高并發(fā)短鏈系統(tǒng)

2021-03-24 10:25:24

優(yōu)化VUE性能

2025-03-26 01:25:00

MySQL優(yōu)化事務

2024-03-07 17:21:12

HotSpotJVMHot Code

2025-04-29 02:00:00

高并發(fā)系統(tǒng)場景

2024-05-28 10:14:31

JavaScrip模板引擎

2024-11-26 08:09:58

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜无码国产理论在线 | 国产精品成人一区二区三区 | 日本手机在线 | 成人精品在线视频 | 西西裸体做爰视频 | 欧美一级特黄aaa大片在线观看 | 国产精品一区二区三区四区 | 丝袜一区二区三区 | 中文字幕在线看 | 精品国产乱码久久久久久丨区2区 | 久久婷婷国产麻豆91 | 亚洲精选一区二区 | 欧美精品一区在线发布 | www久久99| 麻豆a级片| 欧美一区二区成人 | 国产高清一区二区 | 成人深夜福利网站 | 狠狠做深爱婷婷综合一区 | 一区二区在线不卡 | 欧美日本韩国一区二区三区 | 久久久久久av| 日韩欧美亚洲 | 久久久久国产精品一区二区 | 96av麻豆蜜桃一区二区 | 国产乱码高清区二区三区在线 | 日日夜夜天天干 | 成人影院午夜 | 超碰最新在线 | 少妇特黄a一区二区三区88av | 亚洲欧洲av在线 | 国产综合区 | 91精品国产高清一区二区三区 | 久久久久电影 | 久久一区二区视频 | 中文字字幕一区二区三区四区五区 | 成人在线不卡 | 在线成人免费观看 | 精精国产xxxx视频在线播放7 | 国产亚洲精品综合一区 | 国产美女久久 |