在使用function的形式创建组件时,内部state就无法向class声明组件去通过shouldComponentUpdate进行判断值是否变化,这样就会出现较大的性能消耗,所以就有了useMemo和useCallback,(PS:useMemo返回缓存的变量,useCallback返回缓存的函数)
1.useMemo
import React,{useMemo, useState} from 'react';
export default function NumMemo() {
const [num, setNum] = useState(1);
const [val, setValue] = useState('');
function getNum() {
console.log("num",num)
}
return <div>
<h4>num:{num}------val:{val}--------{getNum()}</h4>
<div>
<input value={val} onChange={event => setValue(event.target.value)}/>
<button onClick={() => setNum(num + 1)}>num+1</button>
</div>
</div>;
}
根据上面的例子,无论是改变count还是num的值,都会引起组件的重新渲染,getNum方法都会执行,getNum方法里面的逻辑只跟num值有关,所以我们只想在num值改变时在执行getNum方法,这时useMemo就派上用场了。
import React,{useMemo, useState} from 'react';
export default function NumMemo() {
const [num, setNum] = useState(1);
const [val, setValue] = useState('');
const getNum=useMemo(()=>{
console.log('num',num)
},[num])
return <div>
<h4>num:{num}------val:{val}--------{getNum}</h4>
<div>
<input value={val} onChange={event => setValue(event.target.value)}/>
<button onClick={() => setNum(num + 1)}>num+1</button>
</div>
</div>;
}
此时,只有当num值改变时才会执行getNum方法
2.useCallback (useCallback(fn, deps) 相当于 useMemo(() => fn, deps))
useCallback单独使用实际性能会更差,有助于提高性能的场景:1.函数定义时需要进行大量运算2.需要比较的场景,配合useMemo使用