配置化菜单
菜单与路由的耦合度比较高,因此可以使用同一个文件生成
一个常见的菜单可能为以下两种情况
#
顶部导航#
侧边导航这两种导航效果,一般组件库都实现了Menu目录组件,基于此,我们便可以遍历配置文件,动态生成。
可以通过查看Antd目录配置文件所需的配置信息,来确定我们的路由目录配置文件需要提供哪些信息。
注意: Antd中侧边布局与上下布局的Menu略有区别,我们先以侧边布局为例
以上为一个基本的可以展开的侧边栏导航的内容,我们自上而下查看可配置的内容:
<Sider>
#
- collapsible
- collapsed
- onCollapse
侧边栏收起状态,默认我们是允许侧边栏可收起/展开,因此需要有一组控制侧边栏展开与收起的按钮组。
我们可以省心一些,在当前组件中添加按钮组,将状态放在该组件中,然后使用useState来控制状态。效果如下。
提示: 如果你需要将控制按钮放在其他位置,比如
<Title />
中,那么可能需要使用全局状态管理。
<Menu>
#
- mode 侧边导航栏固定值 inline
- defaultSelectedKeys
- defaultOpenKeys
下面两个参数主要处理,在页面第一次打开后,能够自动展开对应的侧边栏,以及选中正确的侧边栏。
注意:我们可能会遇到path配置有参数的情况,比如
user/:id
这样的路径匹配的问题。这个可以通过path-to-regexp
包进行处理。
使用defaultXXX
的值,是将控制权交给Menu组件的非受控组件的形式,这样只有在页面加载的时候,会进行初始化一次。之后只有点击对应的侧边栏时,才会更新展开的栏。但是有一种情况是,我们在应用内使用
展开父级目录的问题就修复了,这样无论是用户点击展开父级目录,还是history.location.pathname
改变,都可以正确的更新openKeys
展开目录了。
注意:这里并没有设置
selectedKeys
的onChange事件,因为不需要绑定事件,selectedKeys
是与pathname
耦合的,点击栏目之后,一定会跳转,pathname一定会改变,该值也会跟随改变。
剩下的,便是遍历路由+侧边栏配置信息,生成侧边栏内容了。我们根据需要的信息暂时定义需要以下内容。
在RouteProps
参数中,其实是含有path参数的,但是该参数的属性类型是path?: string | string[];
,其中string[]
不利于我们遍历生成单一链接的侧边栏,因此override为string
类型。
这样,一个普通的路由配置信息示例如下:
我们遍历该数组,将需要展示的组件以下两种情况分别展示即可:
- 有子路由,且子路由
hide: false
的元素数量大于0的,使用<SubMenu />
组件 - 没有子路由,且
hide: false
的元素,使用<Menu.Item />
组件
以上,我们便根据配置信息,生成了侧边栏信息。
但是,路由配置信息,并不是一个标准的react-router配置文件,因此我们仍需要将该文件拍平为一维数组。