【发布时间】:2019-08-08 16:07:57
【问题描述】:
我有一个有效的class based implementation of an Accordion component,我是trying to refactor,可以使用新的hooks api。
我的主要挑战是找到一种方法来仅重新渲染切换的 <AccordionSection />,同时防止所有其他 <AccordionSection/> 组件在每次父 <Accordion/> 的状态时重新渲染(跟踪状态的打开部分)已更新。
在基于类的实现中,我设法通过将<AccordionSection /> 设为PureComponent,通过使用@987654333 的高阶组件将isOpen 和onClick 回调传递给它来实现这一点@API,和通过将这些回调保存在父 <Accordion/> 组件的状态如下:
this.state = {
/.../
onClick: this.onClick,
isOpen: this.isOpen
};
据我了解,它保留了对它们的引用,从而防止它们在每次 <Accordion /> 更新时被创建为新实例。
但是,我似乎无法让它与基于钩子的实现一起使用。
我已经尝试过的一些事情没有成功:
使用
memo包装 Accordion 部分 - 包括第二个回调参数的各种渲染条件。用
useCallback包装onClick和isOpen回调(似乎不起作用,因为它们具有在每个<Accordion/>渲染上更新的依赖项)将
onClick和isOpen保存到如下状态:const [callbacks] = useState({onClick, isOpen}),然后将callbacks对象作为ContextProvidervalue传递。 (好像错了,没用)
以下是对我的基于工作类的实现的引用:
https://codesandbox.io/s/4pyqoxoz9
我的钩子重构尝试:
https://codesandbox.io/s/lxp8xz80z7
我将日志保存在 <AccordionSection/> 渲染中,以展示我试图阻止的重新渲染。
非常感谢任何意见。
【问题讨论】:
标签: javascript reactjs performance components react-hooks