umijs+Procomponents的高级布局搭建中后台管理系统框架(二)

介绍

本文衔接umijs+Procomponents的高级布局搭建中后台管理系统框架(一),继续搭建进阶版高级布局(含头像,搜索栏,外链等)

以下是最终布局效果

安装的依赖

"@ant-design/icons": "5.0.1",
    "@ant-design/pro-components": "2.4.3",
    "@ant-design/pro-layout": "7.4.0",
    "antd": "4.24.7",
    "react": "18.2.0",
    "react-dom": "18.2.0",
    "@emotion/css": "^11.10.5",
    "umi": "^3.5.38"

这里使用的是antd的4版本,因为5版本用的时候有报错(自行取舍)

顶部导航栏(头像、搜索框、外链、下拉框)

1. 头像布局,使用Prolayout的avatarProps配置,可以根据不同的layout放在不同的位置

直接往src/layouts/index的Prolayout标签里放就行了(icon和图片可以自己替换)

avatarProps={{
                src: 'https://gw.alipayobjects.com/zos/antfincdn/efFD%24IOql2/weixintupian_20170331104822.jpg',
                size: 'small',
                title: '七妮妮',
                render: (props, dom) => {
                    return (
                        <Dropdown
                            menu={{
                                items: [
                                    {
                                        key: 'logout',
                                        icon: <LogoutOutlined />,
                                        label: '退出登录',
                                    },
                                ],
                            }}
                        >
                            {dom}
                        </Dropdown>
                    );
                },
            }}

2. 搜索栏

也是直接直接往src/layouts/index的Prolayout标签里放

actionsRender={(props) => {
                if (props.isMobile) return [];
                if (typeof window === 'undefined') return [];
                return [
                    props.layout !== 'side' && document.body.clientWidth > 1400 ? (
                        <SearchInput />
                    ) : undefined,
                    <InfoCircleFilled key="InfoCircleFilled" />,
                    <QuestionCircleFilled key="QuestionCircleFilled" />,
                    <GithubFilled key="GithubFilled" />,
                ];
            }}

这里出现一个Searchinput,是一个方法(JSX),需要自己在上面(return之前)写入:

const SearchInput = () => {
        const { token } = theme.useToken();
        return (
            <div
                key="SearchOutlined"
                aria-hidden
                style={{
                    display: 'flex',
                    alignItems: 'center',
                    marginInlineEnd: 24,
                }}
                onMouseDown={(e) => {
                    e.stopPropagation();
                    e.preventDefault();
                }}
            >
                <Input
                    style={{
                        borderRadius: 4,
                        marginInlineEnd: 12,
                        backgroundColor: token.colorBgTextHover,
                    }}
                    prefix={
                        <SearchOutlined
                            style={{
                                color: token.colorTextLightSolid,
                            }}
                        />
                    }
                    placeholder="搜索方案"
                    bordered={false}
                />
                <PlusCircleFilled
                    style={{
                        color: token.colorPrimary,
                        fontSize: 24,
                    }}
                />
            </div>
        );
    };

3. 下拉框

这是一个方法(JSX),在return之前定义好

const MenuCard = () => {
        const { token } = theme.useToken();
        return (
            <div
                style={{
                    display: 'flex',
                    alignItems: 'center',
                }}
            >
                <Divider
                    style={{
                        height: '1.5em',
                    }}
                    type="vertical"
                />
                <Popover
                    placement="bottom"
                    overlayStyle={{
                        width: 'calc(100vw - 24px)',
                        padding: '24px',
                        paddingTop: 8,
                        height: '307px',
                        borderRadius: '0 0 6px 6px',
                    }}
                    content={
                        <div style={{ display: 'flex', padding: '32px 40px' }}>
                            自定义内容
                        </div>
                    }
                >
                    <div
                        style={{
                            color: token.colorTextHeading,
                            fontWeight: 500,
                            cursor: 'pointer',
                            display: 'flex',
                            gap: 4,
                            paddingInlineStart: 8,
                            paddingInlineEnd: 12,
                            alignItems: 'center',
                        }}
                        className={css`
              &:hover {
                background-color: ${token.colorBgTextHover};
              }
            `}
                    >
                        <span> 企业级资产中心</span>
                        <CaretDownFilled />
                    </div>
                </Popover>
            </div>
        );
    };

然后直接往Prolayout标签里丢 

 headerTitleRender={(logo, title, _) => {
                const defaultDom = (
                    <a>
                        {logo}
                        {title}
                    </a>
                );
                if (typeof window === 'undefined') return defaultDom;
                if (document.body.clientWidth < 1400) {
                    return defaultDom;
                }
                if (_.isMobile) return defaultDom;
                return (
                    <>
                        {defaultDom}
                        <MenuCard />
                    </>
                );
            }}

4. 外链(左上角那个九宫格图标)

外链的链接可以自己定义,这里为了做演示,使用的是官网的例子

首先在src/layouts下新建一个文件,这里写为defaultProps.tsx(官网名):

import {
    ChromeFilled,
    CrownFilled,
    SmileFilled,
    TabletFilled,
} from '@ant-design/icons';

export default {
    route: {
        path: '/',
        routes: [
            {
                path: '/welcome',
                name: '欢迎',
                icon: <SmileFilled />,
                component: './Welcome',
            },
            {
                path: '/admin',
                name: '管理页',
                icon: <CrownFilled />,
                access: 'canAdmin',
                component: './Admin',
                routes: [
                    {
                        path: '/admin/sub-page1',
                        name: '一级页面',
                        icon: 'https://gw.alipayobjects.com/zos/antfincdn/upvrAjAPQX/Logo_Tech%252520UI.svg',
                        component: './Welcome',
                    },
                    {
                        path: '/admin/sub-page2',
                        name: '二级页面',
                        icon: <CrownFilled />,
                        component: './Welcome',
                    },
                    {
                        path: '/admin/sub-page3',
                        name: '三级页面',
                        icon: <CrownFilled />,
                        component: './Welcome',
                    },
                ],
            },
            {
                name: '列表页',
                icon: <TabletFilled />,
                path: '/list',
                component: './ListTableList',
                routes: [
                    {
                        path: '/list/sub-page',
                        name: '列表页面',
                        icon: <CrownFilled />,
                        routes: [
                            {
                                path: 'sub-sub-page1',
                                name: '一一级列表页面',
                                icon: <CrownFilled />,
                                component: './Welcome',
                            },
                            {
                                path: 'sub-sub-page2',
                                name: '一二级列表页面',
                                icon: <CrownFilled />,
                                component: './Welcome',
                            },
                            {
                                path: 'sub-sub-page3',
                                name: '一三级列表页面',
                                icon: <CrownFilled />,
                                component: './Welcome',
                            },
                        ],
                    },
                    {
                        path: '/list/sub-page2',
                        name: '二级列表页面',
                        icon: <CrownFilled />,
                        component: './Welcome',
                    },
                    {
                        path: '/list/sub-page3',
                        name: '三级列表页面',
                        icon: <CrownFilled />,
                        component: './Welcome',
                    },
                ],
            },
            {
                path: 'https://ant.design',
                name: 'Ant Design 官网外链',
                icon: <ChromeFilled />,
            },
        ],
    },
    location: {
        pathname: '/',
    },
    appList: [
        {
            icon: 'https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg',
            title: 'Ant Design',
            desc: '杭州市较知名的 UI 设计语言',
            url: 'https://ant.design',
        },
        {
            icon: 'https://gw.alipayobjects.com/zos/antfincdn/FLrTNDvlna/antv.png',
            title: 'AntV',
            desc: '蚂蚁集团全新一代数据可视化解决方案',
            url: 'https://antv.vision/',
            target: '_blank',
        },
        {
            icon: 'https://gw.alipayobjects.com/zos/antfincdn/upvrAjAPQX/Logo_Tech%252520UI.svg',
            title: 'Pro Components',
            desc: '专业级 UI 组件库',
            url: 'https://procomponents.ant.design/',
        },
        {
            icon: 'https://img.alicdn.com/tfs/TB1zomHwxv1gK0jSZFFXXb0sXXa-200-200.png',
            title: 'umi',
            desc: '插件化的企业级前端应用框架。',
            url: 'https://umijs.org/zh-CN/docs',
        },

        {
            icon: 'https://gw.alipayobjects.com/zos/bmw-prod/8a74c1d3-16f3-4719-be63-15e467a68a24/km0cv8vn_w500_h500.png',
            title: 'qiankun',
            desc: '可能是你见过最完善的微前端解决方案🧐',
            url: 'https://qiankun.umijs.org/',
        },
        {
            icon: 'https://gw.alipayobjects.com/zos/rmsportal/XuVpGqBFxXplzvLjJBZB.svg',
            title: '语雀',
            desc: '知识创作与分享工具',
            url: 'https://www.yuque.com/',
        },
        {
            icon: 'https://gw.alipayobjects.com/zos/rmsportal/LFooOLwmxGLsltmUjTAP.svg',
            title: 'Kitchen ',
            desc: 'Sketch 工具集',
            url: 'https://kitchen.alipay.com/',
        },
        {
            icon: 'https://gw.alipayobjects.com/zos/bmw-prod/d3e3eb39-1cd7-4aa5-827c-877deced6b7e/lalxt4g3_w256_h256.png',
            title: 'dumi',
            desc: '为组件开发场景而生的文档工具',
            url: 'https://d.umijs.org/zh-CN',
        },
    ],
};

然后在src/layouts/index页面引入

import defaultProps from './defaultProps';

使用也和上面一样,直接在Prolayout标签里面写上就行

{...defaultProps}

完成了这些之后,打开浏览器就会出现进阶版的布局啦~

补充

底部有时候会需要用到类似copyright的说明,这里也补充一下

menuFooterRender={(props) => {
                if (props?.collapsed) return undefined;
                return (
                    <div
                        style={{
                            textAlign: 'center',
                            paddingBlockStart: 12,
                        }}
                    >
                        <div>© 这里是copyright~~~</div>
                        <div>2023 lexie12138出品</div>
                    </div>
                );
            }}

这个方法就不需要定义了,直接在标签里写入就行

当然,写完后会是个超级长的页面,可以自己拆分组件的,有问题欢迎留言~如果有帮到你,请留下你的赞哦~~~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ts-umijs-react 是一个开源项目,它结合了 TypeScript、UmiJSReact 的强大功能。其,TypeScript 是一种由 Microsoft 开发的静态类型检查工具,它可以帮助我们在开发过程更早地发现潜在的错误,提高代码的可维护性和可读性。UmiJS 是一个基于 React 的企业级前端框架,它提供了一套完整的生态系统,包含了路由、构建工具、插件等功能,使得开发者可以更轻松地构建大型应用程序。而 React 是一个流行的 JavaScript 库,用于构建用户界面,它提供了高效的组件化开发模式,使得我们可以将整个应用程序分成小块的可复用组件,提高代码的可维护性和可重用性。 ts-umijs-react 项目的优势在于结合了这三者的特点,可以使我们的开发过程更加高效和可靠。首先,使用 TypeScript 可以帮助我们减少许多类型相关的错误,提供更好的代码提示和补全,增加代码的可读性和可维护性。 其次,使用 UmiJS 可以帮助我们快速搭建起一个完整的企业级前端应用程序,它提供了一套约定优于配置的开发规范,使得我们可以更加专注于业务逻辑的实现,而不需要花费过多时间去处理一些基础设施的搭建。 最后,使用 React 可以让我们更加方便地构建用户交互界面,提供高效的渲染和更新机制,使得应用程序可以在不同的平台上都有良好的性能和用户体验。 总之,ts-umijs-react 开源项目的结合了 TypeScript、UmiJSReact 的优点,使得我们能够更加高效地开发前端应用程序,提高代码的质量和开发的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值