把“创建”函数和依赖项数组作为参数传⼊入useMemo,它仅会在某个依赖项改变时才重新计算memoized 值。这种优化有助于避免在每次渲染时都进⾏行行⾼高开销的计算。
importReact, { useState, useMemo } from"react";
export default functionUseMemoPage(props) {
const [count, setCount] =useState(0);
constexpensive=useMemo(() => {
console.log("compute");
let sum=0;
for (leti=0; i<count; i++) {
sum+=i;
}
return sum;//只有count变化,这⾥里里才重新执⾏行行
}, [count]);
const [value, setValue] =useState("");
return (<div><h3>UseMemoPage</h3>
<p>expensive:{expensive}</p><p>{count}</p>
<button onClick={() =>setCount(count+1)}>add</button>
<input value={value} onChange={event=>setValue(event.target.value)} /></div> );
}
useCallback
把内联回调函数及依赖项数组作为参数传⼊入useCallback,它将返回该回调函数的 memoized 版本,该回调函数仅在某个依赖项改变时才会更更新。当你把回调函数传递给经过优化的并使⽤用引⽤用相等性去避免⾮非必要渲染(例例如shouldComponentUpdate)的⼦子组件时,它将⾮非常有⽤用
importReact, { useState, useCallback, PureComponent } from"react";
export default function UseCallbackPage(props) {
const [count, setCount] =useState(0);
const addClick=useCallback(() => {
let sum=0;
for (leti=0; i<count; i++) {
sum+=i;
}
return sum;
}, [count]);
const [value, setValue] =useState("");
return (
<div><h3>UseCallbackPage</h3>
<p>{count}</p>
<buttononClick={() =>setCount(count+1)}>add</button>
<inputvalue={value} onChange={event=>setValue(event.target.value)} />
<ChildaddClick={addClick} /></div> );
}
class ChildextendsPureComponent {
render() {
console.log("child render");
const { addClick } =this.props;
return (
<div><h3>Child</h3>
<buttononClick={() =>console.log(addClick())}>add</button></div>
)
}
}
useCallback(fn, deps)相当于useMemo(() => fn, deps)。
注意依赖项数组不不会作为参数传给“创建”函数。虽然从概念上来说它表现为:所有“创建”函数中引⽤用的值都应该出现在依赖项数组中。未来编译器器会更更加智能,届时⾃自动创建数组将成为可能。
补充介绍React的memo与useMemo及useCallback
React.memo概念解析将组件在相同的情况下的渲染结果,缓存渲染结果
当组件传入props
相同的参数时,浅对比之后有之前的传入项,则复用缓存最近一次结果
数据对比,只做浅对比。如果需要控制对比过程,需要自己写自定义比对函数。传参数置第二个参数 -请注意不要与 shouldComponetUpdate
返回值混合
React.PureComponent
shouldComponentUpdate
概念解析函数组件的缓存渲染结果
可以将当前的组件节点颗粒化
通过第二个参数去判断,是否更新useMemo的回调函数
回调函数是一个必包,如果创建使用了 useState
,会缓存 state 值,不会拿到实时更新的值
概念解析返回一个需要缓存的函数
传递需要更新的依赖项,一般回调函数内部使用的数据,都需要添加在依赖项中
避免父子之间,子级生成新的props函数,从而刷新子组件当父级组件传递给子级组件一个函数时,无状态组件每次都会重新生成新的props函数,导致子组件刷新
一般联合useMemo一起使用
到此这篇关于React中useMemo与useCallback的区别的文章就介绍到这了,更多相关React useMemo与useCallback区别内容请搜索易知道(ezd.cc)以前的文章或继续浏览下面的相关文章希望大家以后多多支持易知道(ezd.cc)!