为啥我的标题每次渲染都已经使用 React.memo?

Posted

技术标签:

【中文标题】为啥我的标题每次渲染都已经使用 React.memo?【英文标题】:why my header render every time already use React.memo?为什么我的标题每次渲染都已经使用 React.memo? 【发布时间】:2020-08-06 04:20:18 【问题描述】:

你能告诉我why my header render every time already use React.memo ?我有两个部分my app and user当我从my apps导航到userheader重新渲染为什么?

这是我的代码

https://codesandbox.io/s/fancy-microservice-gl734?file=/src/header.js

import React,  useEffect, useState  from "react";
import  withRouter  from "react-router-dom";

const Header = React.memo(function() 
  console.log("HeaderHeaderHeaderHeaderHeader");

  return <div>header</div>;
);

export default withRouter(Header);

当您运行应用程序时,它会显示apps,但是当您单击user 时,它会显示user 页面..查看控制台标题重新呈现

我试过pure component 还是同样的问题

import React,  PureComponent  from "react";

class Header extends PureComponent 
  render() 
    console.log("HeaderHeaderHeaderHeader");
    return <div>header</div>;
  


export default Header;

https://codesandbox.io/s/fancy-microservice-gl734?file=/src/test.js:0-202

【问题讨论】:

这会给您带来问题吗?随着状态的变化,React 会频繁地重新渲染。 我的问题是停止额外重新渲染..!!哪里改变了状态? 但是为什么重新渲染会出现问题?这在 React 中是一件非常正常的事情,也是它存在的部分核心原因。因此,除非重新渲染实际上给您带来了错误,否则我不会担心。 重新渲染造成性能问题,.. 只有当你测量过它才是一个性能问题。 react-dev-tools profiler 告诉你重新渲染的原因。你可以看看那个。 【参考方案1】:

不幸的是,您尝试做的并不是 React 的工作方式。

React.memo 允许您在父组件使用相同的道具渲染子组件时避免运行子组件的渲染函数。如果reconciliation 将 parent 替换为新组件,则新父级不会重用相同的记忆组件,即使它与最后一个父级渲染相同的子级。

所以对于你的react-router,当你切换路由时,每个组件都会被重新渲染。 DOM 可能仍会避免不必要的更新,但您的渲染函数仍会被调用。

如果您将&lt;Header/&gt; 组件拉出树的更高位置,您或许可以避免重新渲染。

【讨论】:

以上是关于为啥我的标题每次渲染都已经使用 React.memo?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我没有进入 React 无限重新渲染循环?

为啥带有 useContext 触发器的自定义路由 HOC 会重新渲染?

React Native:为啥 FlatList 会在数据更改时完全重新渲染?

为啥每次单元测试后我的数据库都没有被清除?

为啥我的代码在渲染时找不到类?

为啥 useState 会导致组件在每次更新时渲染两次?