react如何防止重复
防止重复渲染
使用 React.memo 对函数组件进行记忆化处理,避免不必要的重新渲染。React.memo 会对组件的 props 进行浅比较,只有当 props 发生变化时才会重新渲染组件。
const MyComponent = React.memo(function MyComponent(props) {
// 组件逻辑
});
使用 useMemo 缓存计算结果
对于计算量大的值,可以使用 useMemo 进行缓存。只有当依赖项发生变化时,才会重新计算值。
const memoizedValue = useMemo(() => computeExpensiveValue(a, b), [a, b]);
使用 useCallback 缓存函数
对于传递给子组件的回调函数,可以使用 useCallback 进行缓存。只有当依赖项发生变化时,才会重新创建函数。
const memoizedCallback = useCallback(() => {
doSomething(a, b);
}, [a, b]);
避免内联对象和函数
在渲染方法中避免直接创建内联对象和函数,这会导致每次渲染都创建新的引用,从而触发子组件的重新渲染。

// 避免这样做
<ChildComponent style={{ color: 'red' }} onClick={() => {}} />
// 应该这样做
const styles = { color: 'red' };
const handleClick = () => {};
<ChildComponent style={styles} onClick={handleClick} />
使用 key 属性优化列表渲染
在渲染列表时,为每个列表项提供唯一的 key 属性,帮助 React 识别哪些项发生了变化,避免不必要的重新渲染。
{items.map(item => (
<ListItem key={item.id} item={item} />
))}
避免状态提升过度
将状态提升到过高的组件层级可能导致不必要的重新渲染。合理组织组件结构,将状态放在合适的层级。

使用 shouldComponentUpdate 进行手动控制
对于类组件,可以通过实现 shouldComponentUpdate 生命周期方法,手动控制组件是否需要重新渲染。
shouldComponentUpdate(nextProps, nextState) {
// 只有当特定 props 或 state 变化时才重新渲染
return this.props.someProp !== nextProps.someProp;
}
使用不可变数据
使用不可变数据可以帮助 React 更高效地进行比较。每次数据变更都返回一个新的对象,而不是修改原有对象。
// 避免直接修改状态
this.state.items.push(newItem);
this.setState({ items: this.state.items });
// 应该使用不可变更新
this.setState(prevState => ({
items: [...prevState.items, newItem]
}));
使用 Context API 谨慎
在使用 Context API 时,Provider 的 value 变化会导致所有消费该 Context 的组件重新渲染。可以通过拆分 Context 或使用 memo 来优化。
const MyContext = React.createContext();
function App() {
const [value, setValue] = useState({});
return (
<MyContext.Provider value={value}>
<Child />
</MyContext.Provider>
);
}






