import React from react;import Drawer from antd;import SiderMenu from SiderMenu;import getFlatMenuKeys from SiderMenuUtils;const SiderMenuWrapper = Reactmemoprops = const isMobile menuData coll
这段代码已经做了一些优化,如使用了 React.memo 进行了组件的记忆化,但还可以进行进一步的优化:
-
将 getFlatMenuKeys 函数提取到 SiderMenuUtils.js 文件中,避免在每次渲染时都重新执行。
-
将 isMobile 属性判断提取到外层组件中,避免在每次渲染时都重新判断。
-
将 Drawer 组件的 visible 属性改为 collapsed 属性的取反,这样可以避免在每次渲染时都重新计算 visible 值。
优化后的代码如下:
// SiderMenuWrapper.js import React from 'react'; import { Drawer } from 'antd'; import SiderMenu from './SiderMenu'; import { getFlatMenuKeys } from './SiderMenuUtils';
const SiderMenuWrapper = React.memo(props => { const { menuData, collapsed, onCollapse, flatMenuKeys } = props; return ( <Drawer collapsed={!collapsed} placement="left" onClose={() => onCollapse(true)} style={{ padding: 0, height: '100vh', }} visible={!props.isMobile} > <SiderMenu {...props} flatMenuKeys={flatMenuKeys} collapsed={collapsed} /> ); });
export default SiderMenuWrapper;
// SiderMenuUtils.js export function getFlatMenuKeys(menuData) { let keys = []; menuData.forEach(item => { if (item.children) { keys = keys.concat(getFlatMenuKeys(item.children)); } keys.push(item.path); }); return keys; }
// 外层组件 function OuterComponent(props) { const isMobile = true; // 根据实际情况判断是否为移动设备 const flatMenuKeys = getFlatMenuKeys(props.menuData); return ( <SiderMenuWrapper {...props} isMobile={isMobile} flatMenuKeys={flatMenuKeys} collapsed={isMobile ? false : props.collapsed} /> ); }
原文地址: https://www.cveoy.top/t/topic/b124 著作权归作者所有。请勿转载和采集!