如何减少不必要的状态更新

背景

有一个时间块应用,当前是用zustand创建的store保存状态,目前都放在一个大的map里,但目前的问题是由于每个日期要保存状态,导致网页频繁刷新。

解决方法

1. 减少不必要的状态更新

确保只有必要的状态变化时才触发重新渲染。使用 Zustand 的选择器(selector)来订阅特定的状态,而不是整个 store。

2. 使用 memoization

在 React 组件中使用 React.memo 和 useMemo 来减少不必要的重新渲染。

3. 使用局部状态

对于不需要全局管理的状态,尽量使用组件的局部状态(useState)。这可以减少全局状态更新带来的渲染压力。

4. 优化数据结构

将日期对应的状态存储在一个嵌套的对象结构中,而不是一个大的 map。这样可以通过深度比较来减少不必要的渲染。

示例代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import create from 'zustand';
import React, { useMemo } from 'react';

// Zustand store
const useStore = create((set) => ({
dates: {},
setDate: (date, data) =>
set((state) => ({
dates: {
...state.dates,
[date]: data,
},
})),
}));

// 日期组件
const DateComponent = React.memo(({ date }) => {
const data = useStore((state) => state.dates[date]);
const setDate = useStore((state) => state.setDate);

// 计算得到的值,避免不必要的计算
const memoizedData = useMemo(() => data, [data]);

return (
<div>
<h3>{date}</h3>
<input
type="text"
value={memoizedData || ''}
onChange={(e) => setDate(date, e.target.value)}
/>
</div>
);
});

// 主组件
const App = () => {
const dates = ['2021-01-01', '2021-01-02', '2021-01-03'];

return (
<div>
{dates.map((date) => (
<DateComponent key={date} date={date} />
))}
</div>
);
};

export default App;

请我喝杯咖啡吧~

支付宝
微信