Búsqueda de sitios web

reactjs - Advertencia: [antd: Menu] `children` será eliminado en la próxima versión principal. Por favor, use `items` en su lugar


Tengo un proyecto que contiene varias interfaces, y entre estas interfaces hay una interfaz que contiene una barra lateral, y uso un "menú" para la barra lateral.

Pero tengo este problema:

Warning: [antd: Menu] `children` will be removed in next major version. Please use `items` instead. 

/* eslint-disable react-hooks/exhaustive-deps */
import { Layout, Menu } from 'antd';
import '../../../styles/sidebar/index.scss';
import { FunctionComponent, useContext, useEffect, useState } from 'react';
import _ from 'lodash';
import { FormattedMessage } from 'react-intl';
import { AuthContext, IAuthContext } from '../../../contexts/auth-context';
import { useCurrentPath } from '../../../utils/use-current-path';

const { SubMenu } = Menu;
const { Sider } = Layout;

export interface Children {
    path: string;
    title: string;
    link: string;
    icon: JSX.Element;
}
export interface MenuItems {
    title: string;
    link: string;
    children?: Children[];
    permissions?: string[];
}
export interface SideBarProps {
    header?: any;
    footer?: JSX.Element | string;
    MenuItems: MenuItems[];
    collapsed?: boolean;
    onChange: (link: string) => void;
}

const SideBar: FunctionComponent<SideBarProps> = (props) => {
    const authContext = useContext<IAuthContext>(AuthContext);
    const currentPath = useCurrentPath();
    const [activeIndex, setActiveIndex] = useState<number>();
    const [items, setItems] = useState<MenuItems[]>([]);
    useEffect(() => {
        let menuItems = props.MenuItems.filter((c, i) => {
            if (currentPath?.includes(c.link)) {
                setActiveIndex(i);
            }
            return (
                !c.permissions ||
                c.permissions?.some((per) => {
                    return authContext.actions.hasMainPermission(per);
                })
            );
        });
        setItems(menuItems);
    }, []);
    return (
        <div>
            <Sider
                className='site-layout-background'
                collapsed={props.collapsed}
            >
                <Menu mode='inline' selectedKeys={[String(activeIndex)]}>
                    {items.map((item, index) => {
                        if (item.children && !_.isEmpty(item.children)) {
                            return (
                                <SubMenu
                                    title={
                                        <FormattedMessage
                                            id={item.title}
                                        />
                                    }
                                >
                                    {item.children?.map((child, index) => (
                                        <Menu.Item
                                            key={index}
                                            onClick={() => {
                                                setActiveIndex(index);
                                                props.onChange(item.link);
                                            }}
                                        >
                                            {
                                                <FormattedMessage
                                                    id={child.title}
                                                />
                                            }
                                        </Menu.Item>
                                    ))}
                                </SubMenu>
                            );
                        }
                        return (
                            <Menu.Item
                                key={index}
                                onClick={() => {
                                    setActiveIndex(index);
                                    props.onChange(item.link);
                                }}
                            >
                                {<FormattedMessage id={item.title} />}
                            </Menu.Item>
                        );
                    })}
                </Menu>
            </Sider>
        </div>
    );
};
export default SideBar;

Respuesta #1

La advertencia aparece debido a la actualización en el uso de Menu. En lugar de pasar elementos directamente dentro de <Menu>, puedes pasarlos con una prop items. En tu caso:

<Menu mode='inline' selectedKeys={[String(activeIndex)]} items={listOfItems}/>

Mueve el mapeo de items afuera y pásalo a Menu.

Código completo:

/* eslint-disable react-hooks/exhaustive-deps */
import { Layout, Menu } from 'antd';
import '../../../styles/sidebar/index.scss';
import { FunctionComponent, useContext, useEffect, useState } from 'react';
import _ from 'lodash';
import { FormattedMessage } from 'react-intl';
import { AuthContext, IAuthContext } from '../../../contexts/auth-context';
import { useCurrentPath } from '../../../utils/use-current-path';

const { SubMenu } = Menu;
const { Sider } = Layout;

export interface Children {
  path: string;
  title: string;
  link: string;
  icon: JSX.Element;
}

export interface MenuItems {
  title: string;
  link: string;
  children?: Children[];
  permissions?: string[];
}

export interface SideBarProps {
  header?: any;
  footer?: JSX.Element | string;
  MenuItems: MenuItems[];
  collapsed?: boolean;
  onChange: (link: string) => void;
}

const SideBar: FunctionComponent<SideBarProps> = (props) => {
  const authContext = useContext<IAuthContext>(AuthContext);
  const currentPath = useCurrentPath();
  const [activeIndex, setActiveIndex] = useState<number>();
  const [items, setItems] = useState<MenuItems[]>([]);

  useEffect(() => {
    let menuItems = props.MenuItems.filter((c, i) => {
      if (currentPath?.includes(c.link)) {
        setActiveIndex(i);
      }
      return (
        !c.permissions ||
        c.permissions?.some((per) => {
          return authContext.actions.hasMainPermission(per);
        })
      );
    });
    setItems(menuItems);
  }, []);

  const listOfItems = items.map((item, index) => {
    if (item.children && !_.isEmpty(item.children)) {
      return (
        <SubMenu
          key={index}
          title={<FormattedMessage id={item.title} />}
        >
          {item.children?.map((child, index) => (
            <Menu.Item
              key={index}
              onClick={() => {
                setActiveIndex(index);
                props.onChange(item.link);
              }}
            >
              <FormattedMessage id={child.title} />
            </Menu.Item>
          ))}
        </SubMenu>
      );
    }
    return (
      <Menu.Item
        key={index}
        onClick={() => {
          setActiveIndex(index);
          props.onChange(item.link);
        }}
      >
        <FormattedMessage id={item.title} />
      </Menu.Item>
    );
  });

  return (
    <div>
      <Sider
        className='site-layout-background'
        collapsed={props.collapsed}
      >
        <Menu mode='inline' selectedKeys={[String(activeIndex)]} items={listOfItems}/>
      </Sider>
    </div>
  );
};

export default SideBar;

Artículos relacionados