react 入坑学习(十四)混合菜单新模式(ANT ProLayout)

2023-11-20

混合菜单新模式

样例

Ant Design Pro Blog 文档
在这里插入图片描述
这个明显就比非混合的好看很多,今天就来试试改一改吧

现在官网中找到ProLayout

就可以找到这个混合模式的源码样例

import React from 'react';

import ProLayout, { PageContainer } from '@ant-design/pro-layout';
import complexMenu from './complexMenu';

export default () => (
  <div
    style={{
      height: 400,
      overflow: 'auto',
    }}
  >
    <ProLayout
      location={{
        pathname: '/articles/new',
      }}
      route={{
        routes: complexMenu,
      }}
      disableContentMargin
      layout="top"
    >
      <ProLayout
        location={{
          pathname: '/home/overview',
        }}
        route={{
          routes: complexMenu,
        }}
        navTheme="light"
        menuHeaderRender={false}
      >
        <PageContainer content="欢迎使用">
          <div>Hello World</div>
        </PageContainer>
      </ProLayout>
    </ProLayout>
  </div>
);

有点抽象,但是要怎么使用呢?

这里我用之前搭建的脚手架新项目里的BasicLayout.jsx来修改

这里可以把这个布局理解为在之前的脚手架菜单基础上,添加一个topmenu。然后将原先的rightcontent和menuheader隐藏掉就行。是不是很容易理解?要是理解不了,可以把我之后的代码自己测测看,改动一下就能了解了。

Tips:ProLayout所有以 Render 后缀的方法都可以通过传入 false 来使其不渲染。

那就直接上代码了

BasicLayout.jsx

/**
 * Ant Design Pro v4 use `@ant-design/pro-layout` to handle Layout.
 * You can view component api by:
 * https://github.com/ant-design/ant-design-pro-layout
 */
import ProLayout, { DefaultFooter} from '@ant-design/pro-layout';
import React, { useEffect } from 'react';
import { Link, useIntl, connect, history } from 'umi';
import { GithubOutlined } from '@ant-design/icons';
import { Result, Button } from 'antd';
import Authorized from '@/utils/Authorized';
import RightContent from '@/components/GlobalHeader/RightContent';
import { getAuthorityFromRouter } from '@/utils/utils';
import logo from '../assets/elestric.png';
//logo我是自己挑的,没有用默认的
const noMatch = (
  <Result
    status={403}
    title="403"
    subTitle="Sorry, you are not authorized to access this page."
    extra={
      <Button type="primary">
        <Link to="/user/login">Go Login</Link>
      </Button>
    }
  />
);

/**
 * use Authorized check all menu item
 */
const menuDataRender = (menuList) =>
  menuList.map((item) => {
    const localItem = {
      ...item,
      children: item.children ? menuDataRender(item.children) : undefined,
    };
    return Authorized.check(item.authority, localItem, null);
  });

const defaultFooterDom = (
  <DefaultFooter
    copyright={`${new Date().getFullYear()} 蚂蚁集团体验技术部出品`}
    links={[
      {
        key: 'Ant Design Pro',
        title: 'Ant Design Pro',
        href: 'https://pro.ant.design',
        blankTarget: true,
      },
      {
        key: 'github',
        title: <GithubOutlined />,
        href: 'https://github.com/ant-design/ant-design-pro',
        blankTarget: true,
      },
      {
        key: 'Ant Design',
        title: 'Ant Design',
        href: 'https://ant.design',
        blankTarget: true,
      },
    ]}
  />
);

const BasicLayout = (props) => {
  const {
    dispatch,
    children,
    settings,
    location = {
      pathname: '/',
    },
  } = props;
  /**
   * constructor
   */

  useEffect(() => {
    if (dispatch) {
      dispatch({
        type: 'user/fetchCurrent',
      });
    }
  }, []);
  /**
   * init variables
   */

  const handleMenuCollapse = (payload) => {
    if (dispatch) {
      dispatch({
        type: 'global/changeLayoutCollapsed',
        payload,
      });
    }
  }; // get children authority

  const authorized = getAuthorityFromRouter(props.route.routes, location.pathname || '/') || {
    authority: undefined,
  };
  const { formatMessage } = useIntl();
  return (
    <ProLayout
      logo={<img
        alt="logo"
        style={{ height: '32px' }}
        src={logo}
        onClick={() => {
          handleMenuCollapse(!props.collapsed);
        }}
      />}
      title="my new ant pro project"
      layout="topmenu"
      disableMobile
      rightContentRender={(rightProps) => <RightContent {...rightProps} {...settings} />}
      contentStyle={{ margin: 0 }}
    >
      <ProLayout
        // logo={logo}
        // formatMessage={formatMessage}
        //因为topmenu已经有logo了,所以我们选择将菜单的logo不渲染
        menuHeaderRender={false}
        //footer不好看,我把它也关了
        footerRender={false}
        formatMessage={formatMessage}
        onCollapse={handleMenuCollapse}
        menuItemRender={(menuItemProps, defaultDom) => {
          if (menuItemProps.isUrl || menuItemProps.children || !menuItemProps.path) {
            return defaultDom;
          }

          return <Link to={menuItemProps.path}>{defaultDom}</Link>;
        }}
        breadcrumbRender={(routers = []) => [
          {
            path: '/',
            breadcrumbName: formatMessage({
              id: 'menu.home',
            }),
          },
          ...routers,
        ]}
        itemRender={(route, params, routes, paths) => {
          const first = routes.indexOf(route) === 0;
          return first ? (
            <Link to={paths.join('/')}>{route.breadcrumbName}</Link>
          ) : (
            <span>{route.breadcrumbName}</span>
          );
        }}
        menuDataRender={menuDataRender}
        //因为rightcontent为空,所以header也没有渲染的必要
        headerRender={false}
        rightContentRender={false}
        {...props}
        {...settings}
      >
        <Authorized authority={authorized.authority} noMatch={noMatch}>
          {children}
        </Authorized>
      </ProLayout>
    </ProLayout>
  );
};

export default connect(({ global, settings }) => ({
  collapsed: global.collapsed,
  settings,
}))(BasicLayout);

当然别忘了把下面的menu颜色改了
defaultSettings.js

const proSettings = {
  //改成白色
  navTheme: 'white',
  // 拂晓蓝
  primaryColor: '#1890ff',
  layout: 'side',
  contentWidth: 'Fluid',
  fixedHeader: false,
  fixSiderbar: true,
  colorWeak: false,
  menu: {
    locale: true,
  },
  title: 'Ant Design Pro',
  pwa: false,
  iconfontUrl: '',
};
export default proSettings;

这就是在脚手架生成的BasicLayout.jsx的基础上直接改的

比较重要的改动部分我就写在下面了

//topmenu部分
<ProLayout
  logo={<img
    alt="logo"
    style={{ height: '32px' }}
    src={logo}
    onClick={() => {
      handleMenuCollapse(!props.collapsed);
    }}
  />}
  title="my new ant pro project"
  layout="topmenu"
  disableMobile
  rightContentRender={(rightProps) => <RightContent {...rightProps} {...settings} />}
  contentStyle={{ margin: 0 }}
>
menuHeaderRender={false}
headerRender={false}
rightContentRender={false}

试试看,是不是布局好看多了!!!

如果有帮助到你,点个赞吧!!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

react 入坑学习(十四)混合菜单新模式(ANT ProLayout) 的相关文章

  • 使用 React Hook Form 和 Yup 进行文件输入验证

    我尝试使用 React Hook Form 进行文件输入验证 是的 我写了下面的代码 但是当我测试文件的大小时 它在这里显示console log value 0 size 即使我在文件输入中选择了一个文件 该值也是未定义的 这有什么问题吗
  • 从外部material-ui组件访问主题

    我有一个使用标准深色主题的主题提供商 我希望能够从我自己的自定义组件访问该主题的详细信息 但我不知道如何做到这一点 在下面的例子中 this props theme未定义 ReactDOM render
  • 如何将数组与 setState 一起使用?

    我目前正在使用以下命令将数组映射到 setState 但没有设置任何内容 也没有记录任何错误 如果我明确地逐行写出它 它就会起作用 关于如何解决这个问题有什么想法或建议吗 使用数组设置状态 不设置状态 const myData messag
  • 在 useRef() 中存储回调

    这是一个可变引用的示例 它存储来自反应过度的博客 https overreacted io making setinterval declarative with react hooks function useInterval callb
  • 让Webpack不捆绑文件

    所以现在我正在使用一个原型 我们使用 webpack 用于构建 tsx 文件和复制 html 文件 和 webpack dev server 之间的组合来提供开发服务 正如您可以假设的那样 我们也使用 React 和 ReactDOM 作为
  • 为什么在 ES6 中不应该使用 import all

    所以我最近开始学习 React 并注意到所有文档都有类似的导入 import Apples Bananas Oranges from fruits 但是在研究 React 时我发现这种语法也同样有效 import as Fruits fro
  • 如何将 create-react-app 与较旧的 React 版本一起使用?

    使用时创建反应应用程序 https github com facebookincubator create react app with 自定义反应脚本 https github com kitze custom react scripts
  • 如何使用 ReactJS 使表中的列可以以两种方式排序

    我正在 ReactJS 中构建一个简单的应用程序 它通过调用某个 API 来使用 JSON 数组 然后我将数组的结果填充到表中 我现在想让表的列可排序 我理想的情况是同时进行升序和降序排序 一旦我单击标题 当它按升序排序时 它应该按降序排序
  • 在 React.js 中有条件地设置 html 属性

    我在为 React 中的单选按钮组件设置默认选项时遇到了令人惊讶的困难 这是我的RadioToggle成分 jsx React DOM var RadioToggle React createClass render function va
  • 使用 React-navigation 的 React Native 中的模态窗口

    我在用react navigation在 React Native 中 我想在启动时确定用户是否已登录 如果他 她已经登录 我想打开一个模式窗口 全屏 如何最好地做到这一点 我在反应导航文档中找不到有条件显示屏幕的任何内容 看 你需要改变m
  • 需要将mxGraph与react js集成

    是否有任何示例或示例项目解释如何将 mxGraph 与 React js 集成 import React Component from react import PropTypes from prop types import ReactD
  • 函数执行后重新调用react hook

    我是反应钩子的新手 我有一个钩子函数 它从 API 接收一系列数据并显示在列表中 function useJobs const jobs setJobs React useState const locations setLocations
  • 监听 redux 动作

    我想创建一个可重用的 redux 表模块 它将存储和更新页码 显示的总页数等 我可以在所有页面之间共享这些模块 但是 我需要更新操作来触发刷新数据操作 该操作将根据页面到达不同的端点 因此 可能类似于页面特定的监听 RefreshData
  • 移动浏览器中的 React 性能

    我有一个组件 表 其中包含许多行 其中包含数据编辑 其掩码形式为contenteditable 可以选择所有字段并同时更改所有行 在桌面上它运行得相当快 但在 iPhone 6 上我有不真实的滞后 Safari 每次操作都会挂起 20 秒
  • 过滤嵌套的 JSON 对象

    我有一个搜索栏 您可以在其中输入员工姓名 它应该根据过滤器返回姓名 我有一个嵌套的 JSON 对象 如下所示 我需要深入了解该对象以访问数组中的员工姓名 您可以看到我尝试实现的多个选项 它们已被注释掉 我的问题是代码没有过滤名称并返回所有名
  • 错误:超出最大更新深度。反应状态

    我收到此错误 我猜是由于反应状态爆发 但我不知道这里出了什么问题 所以我有父子关系组件 如下所示 父组件 class App extends Component constructor props super props this stat
  • useEffect 中的 setTimeout 函数输出缓存的状态值

    这很简单 我正在使用 Redux 来管理我的状态 我有一个setTimeout函数在一个useEffect功能 The setTimeout超时值为50000ms 我想要 SetTimeout 处理程序做什么 After 50000ms t
  • React this.state 未定义?

    我正在遵循 Pluralsight 的初学者教程 在表单提交时将值传递给addUser组件方法 我需要将 userName 推送到this state users但我收到错误 App jsx 14 Uncaught TypeError Ca
  • (节点:20732)[DEP0018] DeprecationWarning:未处理的承诺拒绝已被弃用。未来在nodejs中

    我正在尝试在我的应用程序中生成确认链接 虽然它工作正常并且也生成链接 但是当我访问该链接时 它在 Chrome 控制台中显示 POST http localhost 3000 api auth confirmation 400 Bad Re
  • 在社交媒体上分享 Reactjs 链接时,react-helmet 中的元标记不显示

    我有一个在客户端运行reactjs的项目 在后端运行nodejs express 我实现了react helmet来更新索引之外的路线的标题和元标记 例如 用户查看帖子 viewpost q POSTID 然后客户做了一个GET reque

随机推荐

  • 准备三个月,终拿快手offer!薪资28k*16

    昨天有VIP小伙伴给小孟说 拿到了快手的offer 聊了半个小时 待遇还不错 准备去了 28k 16薪 快手的k3c职级可对标阿里的P7 前面我说过 能去大厂就去大厂 有机会就去争取 年纪轻轻的 多努力就完事了 找工作运气占很大的成分 甚至
  • 关于Robomaster机甲大师比赛的Yaw轴电机齿轮比不为1:1的解决方法

    Yaw轴电机齿轮比不为1 1的解决方法 问题 解决办法 弊端 问题 在Robomaster比赛中我们的英雄机器人的机械结构没做好 整体做得稍微有点大 云台也是很有质量 于是采用了6020电机带动齿轮1 1 5转动 但这样带来的结果就是有时候
  • 大数据技术之Zookeeper

    大数据技术之Zookeeper 一 zookeeper特点 二 zookeeper单机模式 三 zookeeper 常用命令 四 查看zookeeper 状态的几种方式 一 zookeeper特点 Zookeeper 文件系统 通知机制 1
  • 从零玩转人脸识别之RGB人脸活体检测

    从零玩转RGB人脸活体检测 前言 作者个人博客 点击前往 本期教程人脸识别第三方平台为虹软科技 本文章讲解的是人脸识别RGB活体追踪技术 免费的功能很多可以自行搭配 希望在你看完本章课程有所收获 ArcFace 离线SDK 包含人脸检测 性
  • short定义的两个数相加最后越界问题

    Java 程序语言提供了一些可以作用在整数值上的操作数 比较运算子 得到 boolean 型别的值 数值比较运算子 lt gt gt 和 gt 15 20 1 数值相等运算子 和 15 21 1 数值运算子 得到 int 或 long 型别
  • java pakage、import关键字

    package介绍 常用的包 import 案例
  • C语言结构体初始化的四种方法

    定义 struct InitMember int first double second char third float four 方法一 定义时赋值 struct InitMember test 10 3 141590 method o
  • 静态功耗具体指什么

    之前我的理解一直为静态功耗等同于关机功耗 今天专门搜索了解了下 百度百科给出的定义是指漏电流功耗 是电路状态稳定时的功耗 其数量级很小 其实这个定义很模糊 怎样的状态是电路稳定状态 我自己的理解是静态功耗为两种 一 等同于关机功耗 即器件全
  • ssh连接很慢GSS failure解决办法

    什么导致了 scp 和 ssh 的登陆提示速度下降 就我自身所遇到的情况来看 这些延迟绝大部分是 GSSAPI 的认证功能导致的 你可以用 v 选项确认你的情况 例如 下面是 ssh 的详细登陆过程 cherry cherry ssh v
  • 原生JS实现随着鼠标滚动到元素位置触发对应css3动画,简单易用

    废话不多说 直接上代码 附用法 纯博主手写 看完后 觉得好左上角请点个赞 觉得不好的请留下您的建议 谢谢 此代码改版很方便 大家可以任意发挥 注意 如果不想自己写动画的 可以引入Animate css 相信这个动画库大家都不陌生 body
  • modbus协议crc校验c语言代码,modbus协议crc校验

    数据校验是数据传输必不可少的一部分 主要目的就是防止数据传输过程中出现差错 本文主要根据原理实现它的核心代码 预置1个16位的寄存器为十六进制FFFF 全1 此寄存器为CRC寄存器 把第一个8位二进制数据 即通讯信息帧的第一个字节 与16位
  • MySQL 常用高可用方案

    这一节内容来简单聊聊 MySQL 最常用的几种高可用方案 1 主从或主主 Keepalived 主从或主主 Keepalived 算是历史比较悠久的 MySQL 高可用方案 常见架构如下 其大致原理是 在主实例的 Keepalived 中
  • AIGC之Stable Diffusion 提示词学徒库

    前言 描述 本文主要用来记录 提示词TAG 一 提示词 1 提升画面品质的提示词 masterpiece 杰作 best quality 最佳品质 ultra highers 超高分辨率 8k resolution 8k分辨率 realis
  • C++基础问题

    1 在 main 函数执行之前和之后的代码可能是什么 main 函数执行之前 初始化系统相关资源 设置栈指针 初始化 static 变量和 global 变量 未初始化的全局变量赋初值 全局对象初始化 这里会调用构造函数 这是可能会调用的代
  • 为什么越来越多的 IT 人考软考?

    近几年随着国家计算机与软件技术的发展 每年报名参加软考考试的人也越来越多 据工信部新闻发布会消息 计算机软件与通信专业技术人员职业资格考试累计报考人数超过485万 2022年报考人数129万人 01 为什么越来越多的IT人考软考证书 1 软
  • 【精品示例】超实用Python爬虫入门实例——做一个优质舔狗

    引言 最近发现了一个有意思的网站 里面充斥了大量的舔狗箴言 作为一个爬虫发烧友怎么能错过此等机会 咱们直接就是上才艺 类的编写 本次爬虫使用了多协程的方案进行 保证了爬虫的速度 在这里我们新建一个爬虫类 并在里边添加上我们需要的方法 网页的
  • IDEA打包上传到阿里云私服

    上传阿里云私服报错 ERROR Failed to execute goal org apache maven plugins maven deploy plugin 2 8 2 deploy default deploy on proje
  • 通讯录系统图形化界面(C++,Qt5.12)(Visual Studio2019,QtCreator)(初学)

    目录 无用的前言 无用的话 无需用看 前言 一 开发工具 二 功能演示以及 源码和安装包 下载 三 功能介绍以及设计思路 四 代码具体实现 项目文件结构 main cpp mainwindow ui mainwindow h mainwin
  • 2.前端笔记-CSS-字体属性

    1 字体系列 CSS使用font family属性定义文本的字体系列 body font family 思源黑体 Microsoft YaHei 建议 使用英文写字体的属性值 尽量使用系统默认自带字体 保证在任何用户的浏览器都可以显示 微软
  • react 入坑学习(十四)混合菜单新模式(ANT ProLayout)

    混合菜单新模式 样例 Ant Design Pro Blog 文档 这个明显就比非混合的好看很多 今天就来试试改一改吧 现在官网中找到ProLayout 就可以找到这个混合模式的源码样例 import React from react im