Javascript 如何使用useEffect钩子实现复杂的shouldComponentUpdate?
我有一个容器组件,我想将其转换为功能组件并使用react挂钩,比如useffect。但是,我有一个相当复杂的shouldComponentUpdate函数,它根据当前的道具和状态以及下一个道具和状态执行一些逻辑,以防止不必要的渲染 以下是我的shouldComponentUpdate函数:Javascript 如何使用useEffect钩子实现复杂的shouldComponentUpdate?,javascript,reactjs,react-hooks,Javascript,Reactjs,React Hooks,我有一个容器组件,我想将其转换为功能组件并使用react挂钩,比如useffect。但是,我有一个相当复杂的shouldComponentUpdate函数,它根据当前的道具和状态以及下一个道具和状态执行一些逻辑,以防止不必要的渲染 以下是我的shouldComponentUpdate函数: shouldComponentUpdate(nextProps, nextState) { const { current, id, language: { isRtl }, query: { res
shouldComponentUpdate(nextProps, nextState) {
const { current, id, language: { isRtl }, query: { response: { cookie, hits } } } = this.props;
if (nextProps.language.isRtl !== isRtl) {
return true;
}
const { selected } = this.state;
if (current !== nextProps.current) {
if (id === nextProps.current) {
if (nextProps.direction !== 0) {
this.select(nextProps.direction > 0 ? 0 : hits.length - 1, true);
return false;
}
} else {
if (selected >= 0) {
this.setState({ selected: -1 });
}
return false;
}
}
if (cookie === null && nextState.selected !== selected) {
const redrawHit = (index, className) => {
if (index >= 0) {
hits[index].ref.current.updateState({ className });
}
};
redrawHit(nextState.selected, 'hit-selected');
redrawHit(selected, 'hit-deselected');
}
return cookie !== null;
}
我无法找到一种通过useEffect钩子实现它的正确方法。有人能帮我吗?你没有。首先,功能组件没有任何类似于
nextState
或nextProps
的东西,它们只有当前的状态
和道具
,您可以记住/存储以前的道具。但是当您访问它们时,您已经在渲染函数中了。使代码真正难以翻译的是,您的shouldComponentUpdate
方法有副作用,它更新状态并调用其他方法。所有这些都必须在FC的render
方法中,因为FC基本上只是一个大的render
方法。FC不是所有问题的解决方案。也许您希望将当前组件中的代码分解为多个较小的组件,然后组合它们。或者你带我们看全班,也许我们可以推荐另一种方法。嗨@Thomas,谢谢你的回复。整个班级都太大了,不能容纳在这里。你能给我一封电子邮件让我把它发给你吗?“整个班级都太大了,不能放在这里。”然后你当然应该把它分开。你如何保持监督?“你能给我发封电子邮件让我给你吗?”不,我不这么做。这里的潜“安排”是人们在他们想要的时候回答,如果他们想要的话。我不会把它变成一个伪顾问关系。如果你担心大班会把问题弄得一团糟,你可以把它放在一个(隐藏的)片段中。或者你可以用相关的部分创建一个片段/提琴/笔。试着阅读一下,看看这是否符合你的要求,这可能会解决你的问题。你没有。首先,功能组件没有任何类似于nextState
或nextProps
的东西,它们只有当前的状态
和道具
,您可以记住/存储以前的道具。但是当您访问它们时,您已经在渲染函数中了。使代码真正难以翻译的是,您的shouldComponentUpdate
方法有副作用,它更新状态并调用其他方法。所有这些都必须在FC的render
方法中,因为FC基本上只是一个大的render
方法。FC不是所有问题的解决方案。也许您希望将当前组件中的代码分解为多个较小的组件,然后组合它们。或者你带我们看全班,也许我们可以推荐另一种方法。嗨@Thomas,谢谢你的回复。整个班级都太大了,不能容纳在这里。你能给我一封电子邮件让我把它发给你吗?“整个班级都太大了,不能放在这里。”然后你当然应该把它分开。你如何保持监督?“你能给我发封电子邮件让我给你吗?”不,我不这么做。这里的潜“安排”是人们在他们想要的时候回答,如果他们想要的话。我不会把它变成一个伪顾问关系。如果你担心大班会把问题弄得一团糟,你可以把它放在一个(隐藏的)片段中。或者你可以创建一个只包含相关部分的片段/提琴/笔。试着阅读一下,看看这是否符合你的要求,这可能会解决你的问题。