useMemo和useCallback是作为性能优化的,减少一些不必要的渲染
对值的优化,如果这个值是依赖于某个值计算来的,我不希望其他state变化的时候,这个值也被重新渲染。
function Test1 (props) {
const [a,seta]=useState(0)
const [b,setB]=useState(0)
function getRes() {
console.log('getRes函数执行了');
return '哈哈哈哈'+b
}
//使用hook
const resB=useMemo(getRes,[b])//根据b的值计算渲染
//不使用hook
const resB=getRes()
return(
<>
<Button onClick={()=>{seta(a=>a+1)}}>a加1</Button>
<Button onClick={()=>{setB(b=>b+1)}}>b加1</Button>
<p>a是:{a}</p>
<p>b是:{b}</p>
<p>由b计算的值:{resB}</p>
</>
)
}
不使用hook的话每次渲染组件时候,无论你点a还是点b都会重新计算一次
对函数渲染的优化,不希望这个函数每次state变化的时候,都被重新创建
let set=new Set()//Set集合不会插入重复值
function Test1 (props) {
const [a,seta]=useState(0)
/*使用hook写法*/
const add=useCallback(()=>{seta(a=>a+1)},[])
/*不使用hook的普通写法*/
const add=()=>{seta(a=>a+1)}
set.add(add)
console.log(set.size);
return(
<>
<Button onClick={add}>a加1</Button>
</>
)
}
不使用hook每次组件重新渲染都会创建一个新的函数,因为set集不会插入相同的数据,所以很好验证
usexxx(()=>{},[依赖])
只有当我的依赖发生变化之后,才会执行对应的函数内容,即可以称之为驱动,受到依赖项的驱动发生的改变。
const resB=useMemo(getRes)
const resB=useMemo(getRes,[])
const resB=useMemo(getRes,[b])
const resB=useMemo(getRes,[a,b])
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- azee.cn 版权所有 赣ICP备2024042794号-5
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务