- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
如 docs 中所述, 使用回调
返回一个内存回调。
传递一个内联回调和一个输入数组。 useCallback
将返回回调的内存版本,该回调仅在其中一个输入发生变化时发生变化。这在将回调传递给依赖于引用相等性的优化子组件以防止不必要的渲染(例如 shouldComponentUpdate)时非常有用。
const memoizedCallback = useCallback(
() => {
doSomething(a, b);
},
[a, b],
);
但是它是如何工作的以及在 React 中哪里最好使用它?
附言我认为可视化 codepen example会帮助大家更好的理解它。 Explained in docs .
最佳答案
当您想要防止不必要的重新渲染以获得更好的性能时,最好使用此方法。
比较这两种将回调传递给取自 React Docs 的子组件的方法:
class Foo extends Component {
handleClick() {
console.log('Click happened');
}
render() {
return <Button onClick={() => this.handleClick()}>Click Me</Button>;
}
}
class Foo extends Component {
constructor(props) {
super(props);
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
console.log('Click happened');
}
render() {
return <Button onClick={this.handleClick}>Click Me</Button>;
}
}
假设<Button>
实现为 PureComponent
, 第一种方式会导致 <Button>
每次重新渲染<Foo>
重新渲染,因为在每个 render()
中创建了一个新函数称呼。在第二种方式中,handleClick
方法仅在 <Foo>
中创建一次的构造函数并跨渲染重用。
如果我们使用钩子(Hook)将这两种方法转化为功能组件,那么这些是等价物(某种程度上):
function Foo() {
const handleClick = () => {
console.log('Click happened');
}
return <Button onClick={handleClick}>Click Me</Button>;
}
function Foo() {
const memoizedHandleClick = useCallback(
() => console.log('Click happened'), [],
); // Tells React to memoize regardless of arguments.
return <Button onClick={memoizedHandleClick}>Click Me</Button>;
}
第一种方式在功能组件的每次调用时创建回调,但在第二种方式中,React 会为您记住回调函数,并且不会多次创建回调。
因此在第一种情况下如果Button
使用 React.memo
实现它总是会重新渲染(除非你有一些自定义比较功能)因为 onClick
prop 每次都不一样,在第二种情况下,它不会。
在大多数情况下,采用第一种方式就可以了。正如 React 文档所述:
Is it OK to use arrow functions in render methods? Generally speaking,yes, it is OK, and it is often the easiest way to pass parameters tocallback functions.
If you do have performance issues, by all means, optimize!
关于javascript - React 中 useCallback/useMemo 的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53159301/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!