首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >React.memo和withRouter

React.memo和withRouter
EN

Stack Overflow用户
提问于 2020-03-28 12:40:36
回答 2查看 1.9K关注 0票数 2

我不想在某些路径上重新渲染我的组件,尝试使用React.memo并使用withRouter HOC检查当前路径。

不会调用React.memo中的compare函数。

代码语言:javascript
复制
function compare(prevProps, nextProps) {
  console.log(prevProps,nextProps)
  return (prevProps.location.pathname !== '/' && nextProps.location.pathname !== '/')
}
export default React.memo( withRouter(MyComponent), compare);
EN

回答 2

Stack Overflow用户

发布于 2020-10-20 00:44:57

就像这样使用它

代码语言:javascript
复制
function compare(prevProps, nextProps) {
  console.log(prevProps,nextProps)
  return (prevProps.location.pathname == nextProps.location.pathname)
}
export default withRouter(React.memo(MyComponent, compare));

注意你将要做的比较

你的比较有一个流程,如果你在主页面的路由是/,那么比较函数将总是返回false,导致重新渲染所有的时间(就像如果memo不存在在第一个地方),如果你在/以外的子路由中,比如/articles,那么比较将总是返回true,导致组件一直重新渲染,就像memo一开始不存在一样。

你想要的是一个依赖于newold属性的比较,它有equal的东西,这会导致保存重新渲染,或者有不相等的东西,会导致新的重新渲染为你渲染新的数据。

所以比较应该是这样的

代码语言:javascript
复制
prevProps.location.pathname == nextProps.location.pathname
票数 2
EN

Stack Overflow用户

发布于 2021-07-14 20:39:59

谢谢你的问题,两个月前它对我很有帮助。

memo函数获取一个组件和一个function,它将被调用来决定React是否需要重新呈现,如果函数返回true,组件将不会重新呈现,无论如何,如果函数返回false,那么现在属性就不同了,React对您的组件执行re-render

现在:为了在传递给memofunction中正确访问pathname,那么memo应该用withRouter包装,而不是相反,withRouter包装一个组件(它不知道组件的记忆版本,它只是包装它),并将其传递给路由道具。

作为第二个参数传递给memofunction现在可以访问previousnew属性,并进行前面讨论的比较(其中每个属性都包含您想要的完整路由细节)。

代码语言:javascript
复制
import { memo } from 'react';

function propsAreEqualBasedOnPathname(prevProps, nextProps) {
    return prevProps.location.pathname == nextProps.location.pathname;
}

withRouter(memo(MyComponent), propsAreEqualBasedOnPathname);

最后,要特别注意如何在compare function中进行比较,因为一些错误可能会永远阻止您的组件在将来重新呈现。

我发现结合使用memowithRouter对于提高React组件的performance非常重要,特别是如果组件是一个充满细节和获取逻辑的页面,这可能会花费你一些时间来呈现,所以每次重新呈现你保存的时候,都会增加你的页面性能

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60897316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档