packages/rc-components/rc-console-menu/stories/with-items-declaration.tsx (125 lines of code) (raw):

import React, { Fragment } from 'react' import { Link, Route } from 'dva/router' import { Location } from 'history' import ConsoleMenu, { IItemDescriptor } from '@alicloud/console-components-console-menu' import { Input } from '@alicloud/console-components' import { FakeBrowserWithWrapper as FakeBrowser } from '@alicloud/console-components-fake-browser' const renderLinkItem = ({ key, label }: IItemDescriptor) => ( <Link to={key}>{label}</Link> ) const items: IItemDescriptor[] = [ // Defination with label { key: '/home', label: '首页', render: renderLinkItem, navProps: { // 透传给Nav.Item组件的props className: 'test-nav-item-pros', icon: 'smile', // Nav.Item组件不认识的pros,会被它透传到`<li>`DOM节点上 'custom-dom-property': '8237461', }, }, // Defination with custom render { key: '/instance', label: '实例', render: renderLinkItem }, // Defination as a sub menu { key: '/logs', label: '日志', items: [ { key: '/daily', label: '日常环境', render: renderLinkItem }, { key: '/pre', label: '预发环境', render: renderLinkItem }, { key: '/prod', label: '生产环境', render: renderLinkItem }, ], navProps: { // 透传给Nav.SubNav组件的props className: 'test-nav-sub-menu-pros', icon: 'smile', // Nav.SubNav组件不认识的pros,会被它透传到`<li>`DOM节点上 'custom-dom-property': '8237461', }, }, // Another sub menu { key: '/others', label: '其他', items: [ { key: '/help', label: '帮助', render: ({ key, label }) => ( <a href="https://help.aliyun.com" target="_blank" rel="noopener noreferrer" > {label} </a> ), }, { key: '/docs', label: '文档', disabled: true, render: ({ key, label }) => ( <a href="https://docs.aliyun.com" target="_blank" rel="noopener noreferrer" > {label} </a> ), }, ], }, ] /** * 将当前的 location 映射为被选中的 key * @param {Location} location */ const mapLocationToActiveKey = (location: Location) => { if (!location || !location.pathname || location.pathname === '/') { return '/home' } return location.pathname } /** * 使用 items 声明结构化的导航菜单 */ const Example = () => { return ( <FakeBrowser> <Route> {({ location, history }) => { const activeKey = mapLocationToActiveKey(location) return ( <Fragment> <div style={{ marginBottom: 8 }}> <Input key={location.pathname} style={{ width: '100%' }} defaultValue={location.pathname} onPressEnter={ ((e: any) => { history.push(e.target.value) }) as any } /> </div> <div> <ConsoleMenu header="阿里云控制台" items={items} activeKey={activeKey} /> </div> </Fragment> ) }} </Route> </FakeBrowser> ) } export default Example