reactjs - 如何将回调作为道具传递给 React 中的较低组件,而无需每次都创建新的回调?
问题描述
我变得有棱有角并习惯于做出反应。我正在阅读有关事件处理的文档并偶然发现:
class LoggingButton extends React.Component {
handleClick() {
console.log('this is:', this);
}
render() {
// This syntax ensures `this` is bound within handleClick
return (
<button onClick={() => this.handleClick()}>
Click me
</button>
);
}
}
然后文档说:
" 这种语法的问题在于,每次 LoggingButton 渲染时都会创建不同的回调。在大多数情况下,这很好。但是,如果将此回调作为道具传递给较低的组件,则这些组件可能会进行额外的重新渲染. 我们一般建议在构造函数中绑定或使用类字段语法,以避免此类性能问题。 ”
我使用钩子时无权访问构造函数。我应该怎么办?
我准备了一个快速演示。结构是 App > [CompA > Comp B]。组件 B 中有一个按钮可以增加计数,并且计数的状态保存在 App 中。通过 props 将回调从 App 通过 Comp A 委托给 Comp B。每当我单击 Comp B 中的计数按钮时,它都会重新渲染整个 Comp A。这可以通过随机数生成来验证。这个组件很好,但在大型项目中这不是问题吗?
现在想象一下我有一个测验应用程序,我在主应用程序中记录分数。如果有人在 Question 组件中选择了正确答案,我想在主 App 中保留一个计数。这样做会重新渲染任何中间组件。我应该遵循什么模式?
解决方案
使用useCallback
钩子。只要它的依赖关系保持不变,它就会返回相同的函数。
const callback = useCallback(()=> { /* do something */ }, [/* dependencies */])
依赖项的工作方式与useEffect
钩子相同。
编辑
从你的演示来看,<CompA onCount={() => setCount(count + 1)} />
非常好,Dan Abramov 说了这么多。
父级重新渲染将渲染其子级,因此如果计数状态处于父级,则子级将被重新渲染。这完全没问题。React 的构建是为了非常快速地做到这一点。