目录
生命周期函数shouldComponentUpdate (nextProps, nextState)=>{return bool}
extends PureComponent,自动shouldComponentUpdate
Object.is(val0, val1):NaN等,±0不等
useMemo(calculateValue, dependencies):记忆值
useCallback(fn, dependencies):记忆函数
memo和callback类似call和bind:返回函数但不调用
类组件
生命周期函数shouldComponentUpdate
(nextProps, nextState)=>{return bool}
shouldComponentUpdate = (nextProps, nextState) => {
if(this.state.msg === nextState.msg){
return false;
}
else{
return true;//重新渲染
}
}
extends PureComponent,自动shouldComponentUpdate
React.PureComponent
是 React.Component
的一个子类
函数组件
React.memo(函数组件(props))
高阶组件
当父组件的 props 没有发生变化时,React.memo
会使用之前渲染的结果,从而避免重新渲染。
let Welcome = (props) => {
const [ count, setCount ] = useState(0);
const handleClick= () => {
setCount(count+1);
}
const foo = () => {}
return (
<div>
<button onClick={handleClick}>点击</button>
hello Welcome
<Head onClick={foo} />
</div>
);
}
let Head = React.memo(() => {
return (
<div>hello Head, { Math.random() }</div>
)
})
钩子:useMemo
、useCallback
限制:浅比较
Object.is(val0, val1):NaN等,±0不等
react中的比较,无论是缓存,还是响应式数据,都是用的浅比较(引用对象比较地址值)
要想比较对象,需要复制之前的对象值并新建
{ ...state, age: state.age + 1 }
useMemo(calculateValue, dependencies):记忆值
缓存返回值的方式也叫做 记忆化(memoization)
应用:慢的1ms+,计算时间复杂度T(1000+)
time/timeEnd:计算时间
console.time('filter array');
const visibleTodos = filterTodos(todos, tab);
console.timeEnd('filter array');
参数说明
calculateValue
:要缓存计算值的函数
fn
:想要缓存的函数没有参数的纯函数,返回任意类型。
React 将会在首次渲染时调用该函数;
在之后的渲染中,如果
dependencies
没有发生变化,React 将直接返回相同值。否则,将会再次调用
calculateValue
并返回最新结果,然后缓存该结果以便下次重复使用。
useCallback(fn, dependencies):记忆函数
memo和callback类似call和bind:返回函数但不调用
function ProductPage({ productId, referrer, theme }) {
// 在多次渲染中缓存函数
const handleSubmit = useCallback((orderDetails) => {
post('/product/' + productId + '/buy', {
referrer,
orderDetails,
});
}, [productId, referrer]); // 只要这些依赖没有改变
return (
<div className={theme}>
{/* ShippingForm 就会收到同样的 props 并且跳过重新渲染 */}
<ShippingForm onSubmit={handleSubmit} />
</div>
);
}