仅在组件尚未重新渲染时才渲染它

Posted

技术标签:

【中文标题】仅在组件尚未重新渲染时才渲染它【英文标题】:Render a component only if it is not already redendered 【发布时间】:2022-01-06 09:20:09 【问题描述】:

假设我有一个像这样的对象,用于在 React 中创建材质导航栏:

const menu = 
   DASHBOARD: [
      
         name: ViewPage1
         type: VIEW
      ,
      
         name: ViewPage2
         type: VIEW
      ,
      
         name: RunPage1
         type: RUN
      ,
      
         name: RunPage2
         type: RUN
      ,
   ],

我的目标是只渲染一次“类型”标签(查看或运行)。所以有这样的东西:

----VIEW
ViewPage1
ViewPage2
----RUN
RunPage1
RunPage2

我试过这样:

 Object.keys(menu).map((key) => (
          <>
            <Button>
              key
            </Button>
            <Menu>
              <div>           
                menu[key].map((menuItem) => (
                  <TypeLabelComponent label=menuItem.type size="small" variant="outlined" />
                  <MenuItem>
                      menuItem.name
                  </MenuItem>
                ))
              </div>
            </Menu>
          </>
        ))

但很明显,它每次在地图中循环时都会渲染 TYPE 标签。所以我的结果如下:

----VIEW
ViewPage1
----VIEW
ViewPage2
----RUN
RunPage1
----RUN
RunPage2

如何处理此问题以仅在尚未呈现 TYPE 标签的情况下呈现它?

【问题讨论】:

type 分组菜单对象。此外,您在映射项目中缺少 key 道具并为内部 .map() 内容包装 &lt;&gt;&lt;/&gt; 【参考方案1】:

首先将仪表板聚合为对象键,因为类型和值是名称数组。

const menu = 
  DASHBOARD: [
    
      name: "ViewPage1",
      type: "VIEW",
    ,
    
      name: "ViewPage2",
      type: "VIEW",
    ,
    
      name: "RunPage1",
      type: "RUN",
    ,
    
      name: "RunPage2",
      type: "RUN",
    ,
  ],
;

const Component = () => 
  const data = menu.DASHBOARD.reduce((acc, curr) => 
    if (!acc[curr.type]) 
      acc[curr.type] = [];
    
    acc[curr.type].push(curr.name);
    return acc;
  , );

  return (
    <div>
      Object.entries(data).map(([type, names]) => 
        return (
          <div key=type>
            <div>`--------$type`</div>
            names.map((name) => (
              <div key=name>name</div>
            ))
          </div>
        );
      )
    </div>
  );
;

ReactDOM.render(<Component />, document.getElementById("app"));
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>

<div id="app"></div>

【讨论】:

以上是关于仅在组件尚未重新渲染时才渲染它的主要内容,如果未能解决你的问题,请参考以下文章

Vue中重新渲染组件的方法总结

是否可以仅在初始化道具时才渲染反应组件?

仅在验证成功时渲染组件

React Native this.setState() 仅在再次与组件交互后重新渲染

API 更改后重新渲染 React 组件

使用顶层更改响应渲染