5. 菜单配置

5.1. 菜单表配置

_images/table.png

注意

  • parentId为空的是父节点

  • 根节点的排序根据 sibling

  • 同一个父节点的子节点排序根据 sibling

  • 子节点的fullpath = 父节点的fullpath + 子节点的sibling

5.2. 菜单树配置

在首页 app.tsx 中添加请求菜单的后台Servlet,举例:menu.serv

this.anReact = new AnReactExt(this.anClient, this.errorCtx)
                     .extendPorts({
                             menu: "menu.serv",
                             userstier: "users.tier",
                             gpatier: "gpa.tier",
                             mykidstier: "mykids.tier"
                     });

在后台 dataset.xml 中配置获取菜单树的sk,举例:sys.menu.jsample

<c>
        <sk>sys.menu.jsample</sk>
        <mysql>SELECT funcId, parentId, funcName, funcUrl url, sibling sort, fullpath, css, flags
                FROM a_sys_functions f order by f.fullpath
        </mysql>
        <sqlit>SELECT funcId, parentId, funcName, url, sibling sort, fullpath, css, flags
                FROM a_functions f order by f.fullpath
        </sqlit>
        <s-tree>,a_sys_functions,funcId id,parentId,funcName text,,,false</s-tree>
</c>

注意

<s-tree>有严格的参数顺序,每个参数之间用英文逗号分割 ,

  • 第一位表示节点是否被选中

  • 第二位是表名

  • 第三位是主键的字段名

  • 第四位是父级主键的字段名

  • 第五位是fullpath

  • 第六位是sort

  • 第七位是节点名称

5.3. 菜单关联组件

在首页 app.tsx 中添加菜单与组件的对应关系,举例:

SysComp.extendLinks([
    {path: '/sys/domain', comp: Domain},
    {path: '/sys/roles', comp: Roles},
    {path: '/sys/orgs', comp: Orgs},
    {path: '/sys/users', comp: jsample.Userst},
    {path: '/tier/users', comp: jsample.Userst},
]);

注意

注意此处的 path 就是菜单表配置的 url,comp 就是

点击菜单后,首页的右边区域就会根据菜单的 url,找到对应的组件并生成它:

_images/menu.png

5.4. 菜单路由

新的框架没有用 react-router,用的自定义路由匹配,当找到与url完全匹配的组件,就渲染它:

route() {
        const TagName = _comps[this.state.currentPage?.url || '/home'];
        if (TagName)
          return (
                <TagName
                  uri={this.state.currentPage?.url || '/'}
                  {...this.state.currentPage.props}
                  ssInf={(this.context as AnContextType).anClient?.ssInf}
                  />);

        else return <Home />;
}

提示

效果和 react 精准匹配路由是一样,且当前 uri 和其它属性一并传给了该组件