2024-10-29
Component渲染有两个问题:
我们想要的结果: 只有当组件的state或props数据发生改变时才重新render()。
shouldComponentUpdate(nextProps, nextState) {
console.log(this.props, this.state); //目前的props和state
console.log(nextProps, nextState); //接下要变化的目标props和state
// return true // true: 更新 false: 不更新
return this.props.carName !== nextProps.carName
}
export default class Parent extends PureComponent
一共三种方法:memo(), useMemo(), useCallback(),可以把三种方法组合起来。
memo相当于PureComponent,memo()最适合用在纯展示性组件上,这些组件接收简单的props并且很少更新。
import React, { memo } from 'react'
// 基础版本
const MyComponent = memo(function MyComponent(props) {
/* render logic */
return (
<div>{props.name}</div>
)
})
// 自定义比较逻辑版本
const MyComponent = memo(function MyComponent(props) {
return (
<div>{props.name}</div>
)
}, (prevProps, nextProps) => {
// 返回true则不重新渲染,返回false则重新渲染
return prevProps.name === nextProps.name
})
useCallback缓存函数
// 使用useCallback缓存函数
const handleClick = useCallback(() => { setCount(c => c + 1) }, []) // 空依赖数组,函数永远不会重新创建
useMemo缓存计算结果或者组件
import React, { useMemo } from 'react'
function MyComponent({ data }) {
const expensiveValue = useMemo(() => {
// 进行复杂计算
return computeExpensiveValue(data)
}, [data]) // 只有data改变时才重新计算
return <div>{expensiveValue}</div>
}
使用这些优化方案的建议: