- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个工作 class based implementation of an Accordion component我是 trying to refactor使用新的 hooks api .
我的主要挑战是找到一种方法来仅重新渲染切换的 <AccordionSection />
同时防止所有其他<AccordionSection/>
每次父级状态重新渲染的组件<Accordion/>
(跟踪其状态的打开部分)已更新。
在基于类的实现中,我设法通过制作 <AccordionSection />
实现了这一点一个PureComponent
, 通过 isOpen
和 onClick
通过使用 context
的高阶组件回调它API,和通过将这些回调保存在父级 <Accordion/>
上的组件状态如下:
this.state = {
/.../
onClick: this.onClick,
isOpen: this.isOpen
};
据我所知,它保留了对它们的引用,从而防止它们在每个 <Accordion />
上被创建为新实例。更新。
但是,我似乎无法让它与基于 Hook 的实现一起使用。
一些我已经尝试过但没有成功的事情:
用 memo
包裹 Accordion 部分- 在第二个回调参数上包括各种呈现条件。
包装onClick
和 isOpen
回调 useCallback
(似乎不起作用,因为它们具有在每个 <Accordion/>
渲染上更新的依赖项)
正在保存 onClick
和 isOpen
到这样的状态:const [callbacks] = useState({onClick, isOpen})
然后传递 callbacks
对象作为 ContextProvider
value
. (似乎是错误的,并没有奏效)
以下是对我基于工作类的实现的引用:
https://codesandbox.io/s/4pyqoxoz9
我的钩子(Hook)重构尝试:
https://codesandbox.io/s/lxp8xz80z7
我将日志保存在 <AccordionSection/>
上渲染以展示我试图阻止的重新渲染。
任何输入将不胜感激。
最佳答案
所以在追了太多兔子之后我最终添加了这个小金 block ..
const cache = {};
const AccordionSection = memo(({ children, sectionSlug, onClick, isOpen }) => {
if (cache[sectionSlug]) {
console.log({
children: children === cache[sectionSlug].children,
sectionSlug: sectionSlug === cache[sectionSlug].sectionSlug,
onClick: onClick === cache[sectionSlug].onClick,
isOpen: isOpen === cache[sectionSlug].isOpen
});
}
cache[sectionSlug] = { children, sectionSlug, onClick, isOpen };
这表明发生变化的是 onClick
。这看起来很明显,因为 Accordion 组件正在呈现并创建一个新的 onClick
。
用 useCallback
包装他的 onClick
创建纠正了这个问题。
const onClick = useCallback(
sectionSlug =>
setOpenSections({
...(exclusive ? {} : openSections),
[sectionSlug]: !openSections[sectionSlug]
}),
[]
);
虽然我似乎确实在这个过程中打破了 exclusive
因为它现在总是启用..
https://codesandbox.io/s/1o08p08m27
哦,我确实在那里移动了一些可能有助于修复的其他部分..
更新
重构为使用 useReducer
并将所有逻辑移到那里,以便我们可以提供稳定的 onClick
更新
他们说 sleep 很好,但对我来说只是想休眠..
我知道我遗漏了一些东西.. 昨晚意识到我们不需要 reducer ,只需要 setState
的函数形式,它允许我们访问最新的状态在 useCallback
备忘录函数中。在这里转换了@itaydafna 的优化 https://codesandbox.io/s/8490v55029
关于javascript - 将 React PureComponent 重构为基于钩子(Hook)的功能组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55218837/
在 redux 中,如果您的 action/reducer 更新了 foo.bar 的值和您连接的组件的 mapStateToProps 是 (store) => { foo: store.foo }
我正在使用 FlatList,在我的 renderItem 中我有一个名为 GridItem 的 PureComponent。我正在尝试传递需要 item 参数的函数 wishlistAddPrese
我的理解是 PureComponent 利用 shouldComponentUpdate() 并对状态和 props 进行浅层比较,但我创建了一个运行方式与我预期不同的小示例。 示例应用程序显示人员列
考虑以下 React 代码: class Todos extends React.Component { constructor(props) { super(props); th
有人请用一个简单的例子向我解释 React 文档的最后一段,它是关于 React.PureComponent 的,我见过的所有例子都是高级的,我刚刚开始了解这个概念,我看不出它到底是什么指。 正是 c
我想知道这是否可以: import React, { PureComponent } from "react"; import { Text, TouchableOpacity } from "rea
我们使用 ReactJS 创建了一个可重用的列表组件。然而,由于性能问题,我们决定实现 - shouldComponentUpdate 方法,其条件是我的列表组件何时渲染 public shouldC
我目前在我的应用程序中使用 PureComponent 父组件和子组件。我预计 PureComponent 仅在状态或 Prop 发生变化时才会更新。为了确保这一点,我让一个子组件在每次调用它的 co
使用 PureComponents 时与功能组件相比,您的优势在于组件在父组件更新时并不总是呈现。它实际上仅在组件 Prop 发生变化时才会呈现,在此示例中仅当您更改输入时。 如何在不破坏使用此类组件
我是 React 新手,我想知道什么时候应该使用 React Component 以及什么时候应该使用 React PureComponent? 组件: import React, { Compone
我可能会遗漏一些东西,但我有一个这样的组件 export default MyComponent extends React.PureComponent { // ... } 当 MyComp
使用 PureComponent 来提高 React 中的渲染性能似乎是一种常见的技术。然而,当使用具有子项作为 props 的 PureComponent 时,情况似乎并非如此。 class App
向此示例添加样式组件后,我们注意到,当仅修改状态中的一项时,我们的列表组件会更新所有内容。 添加/删除单个条目时,列表渲染亮点(来自 React 开发工具)过多。删除/添加一项,然后所有项目都会突出显
React 表示纯渲染可以优化性能。现在 React 有了 PureComponent。我应该在任何地方使用 React.PureComponent 吗?或者什么时候使用React.PureCompo
阅读When to Use Component or PureComponent在不要在渲染中的函数中绑定(bind)值部分中,它提到而不是这样做 this.likeComment(user.id)
根据文档(https://reactjs.org/docs/react-api.html#react.purecomponent) "React.PureComponent is exactly li
我正在尝试创建一个组件,当某个属性为真时,它不应该执行,但应该执行浅比较(PureComponent 的默认设置)。 我尝试过以下行为: export default class ContentsLi
我知道 shouldComponentUpdate 和 PureComponent 的功能。但我想知道我是否可以同时使用这两者? 假设我有很多 Prop ,我想让 PureComponent 中的浅层
我正在使用PureComponent为了在我的 React 应用程序中获得更好的性能,它有 props但我不希望它在 props 时运行渲染方法改变了。我知道我们不能使用shouldComponent
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 去年关闭。 社区去年审查了是否重新开放此问题,并将其关
我是一名优秀的程序员,十分优秀!