使用React代码动态生成栅格布局的方法


Posted in Javascript onMay 24, 2020

作为 TerminalMACS 的一个子进程模块 - React Web管理端,使用Ant Design Pro作为框架。

本文应用到的知识1.样式文件less中方法的使用2.for循环创建按钮和栅格布局(flex布局)

1. 最终效果及源码链接

作为前端新手的我,做下面这个简单功能花了好几天时间,问了不少前端大佬(大佬们应该要不到半个小时,惭愧惭愧),现在回想问的问题都很基础(有点丢人,哈哈),多谢了哦。

先看看效果

使用React代码动态生成栅格布局的方法

点击浏览源码:开源项目对应源码

2. 代码简单讲解

2.1 TypeScript代码

./src/pages/Grid/DynamicGridPage/index.tsx

import React from 'react';
import styles from './index.less';
import { Button, Card } from 'antd';

interface IVideoPanelProps {}

interface IVideoPanelSate {
 cardCount: number;
}

class VideoPanel extends React.Component<IVideoPanelProps, IVideoPanelSate> {
 constructor(props: Readonly<{}>) {
  super(props);
  this.state = {
   cardCount: 1,
  };
 }

 // 动态生成Grid
 createCard() {
  var res = [];
  for (var i = 0; i < this.state.cardCount * this.state.cardCount; i++) {
   res.push(<Card className={styles['video_panel' + this.state.cardCount]} />);
  }
  return res;
 }

 // 动态生成控制按钮
 createControlButon() {
  var res = [];
  const btnCount = 4;
  for (let i = 1; i <= btnCount; i++) {
   res.push(
    <Button
     key={i}
     className={styles['control_Button']}
     type="primary"
     onClick={() => {
      this.changeCardCount(i);
     }}
    >
     {i + '*' + i}
    </Button>,
   );
  }

  return res;
 }

 // 修改显示的格子数
 changeCardCount(count: any) {
  this.setState({
   cardCount: count,
  });
 }

 render() {
  return (
   <div className={styles.main}>
    <div className={styles.main_child}>
     <div className={styles.left}>
      <div className={styles.left_top}></div>
      <div className={styles.left_bottom}></div>
     </div>
     <div className={styles.right}>
      <div className={styles.right_top}>{this.createCard()}</div>
      <div className={styles.right_bottom}>{this.createControlButon()}</div>
     </div>
    </div>
   </div>
  );
 }
}

export default VideoPanel;

代码不多,for循环生成控制按钮及栅格(未使用antd的Grid布局,简单使用div布局,flex很香),简化了很多代码。

2.2 less样式文件

./src/pages/Grid/DynamicGridPage/index.less

@import '~antd/es/style/themes/default.less';

.main {
 position: absolute;
 width: 100%;
 height: 100%;
 background: red;
}

@ptcWidth: 250px;
@btnAreaHeight: 50px;
@videoPanelMargin: 5px;

.main_child {
 display: flex;
 height: 100%;
}

.left {
 width: @ptcWidth;
 height: 100%;
 background: green;
}

.left_top {
 width: 100%;
 height: @ptcWidth;
 background: orange;
}

.left_bottom {
 width: 100%;
 height: calc(100% - @ptcWidth);
 background: #ccc;
}

.right {
 width: calc(100% - @ptcWidth);
 height: 100%;
 background: #f60;
}

.right_top {
 width: 100%;
 height: calc(100% - @btnAreaHeight);
 background: blue;
 display: flex;
 flex-wrap: wrap;
}

.right_bottom {
 width: 100%;
 height: @btnAreaHeight;
 background: #f90;
}

.control_Button {
 margin: 2px;
}

.video_panel(@count) {
 width: calc(100% / @count - @videoPanelMargin * 2);
 height: calc(100% / @count - @videoPanelMargin * 2);
 margin: @videoPanelMargin;
}

// 1*1
.video_panel1 {
 .video_panel(1);
}

// 2*2
.video_panel2 {
 .video_panel(2);
}

// 3*3
.video_panel3 {
 .video_panel(3);
}

// 4*4
.video_panel4 {
 .video_panel(4);
}

1 * 1、2 * 2、3 * 3、4 * 4 生成的每个栅格的样式格式类似,只是长、宽比例区别,定义了方法(.video_panel(@count)),这是less的语法,极大的扩展了css功能,非常方便。

3. 关于TerminalMACS及本React Web管理端

3.1. TermainMACS

多终端资源管理与检测系统(后续可能转而写成博客系统),包含多个子进程模块,目前开发了Xamarin.Forms客户端、WPF管理端、React Web管理端、.NET Core WEB API服务端,下一步继续完善WPF管理端(IdentityServer 4研究中)。

3.2. React Web管理端

作为TerminalMACS系统的一个子进程模块,目前使用 Ant Design Pro 搭建了框架,在平时工作中,添加一些测试Demo。

4. 关于项目开源开源项目地址:https://github.com/dotnet9/TerminalMACS

官方网站:https://dotnet9.com

总结

到此这篇关于使用React代码动态生成栅格布局的方法的文章就介绍到这了,更多相关react 动态生成栅格布局内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
实例:用 JavaScript 来操作字符串(一些字符串函数)
Feb 15 Javascript
JS拖动技术 关于setCapture使用
Dec 09 Javascript
Javascript中setTimeOut和setInterval的定时器用法
Jun 12 Javascript
JQuery用户名校验的具体实现
Mar 18 Javascript
原生js实现轮播图
Feb 27 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
Jun 13 Javascript
详解js的作用域、预解析机制
Feb 05 Javascript
微信小程序生成二维码的示例代码
Mar 29 Javascript
使用Vue CLI创建typescript项目的方法
Aug 09 Javascript
基于Electron实现桌面应用开发代码实例
Jul 07 Javascript
Vue性能优化的方法
Jul 30 Javascript
Vue如何实现组件间通信
May 15 Vue.js
ES6对象操作实例详解
May 23 #Javascript
ES6函数和数组用法实例分析
May 23 #Javascript
ES6箭头函数和扩展实例分析
May 23 #Javascript
ES6新增的数组知识实例小结
May 23 #Javascript
ES6扩展运算符和rest运算符用法实例分析
May 23 #Javascript
JavaScript组合设计模式--改进引入案例分析
May 23 #Javascript
JavaScript组合模式---引入案例分析
May 23 #Javascript
You might like
成本8450万,票房仅2亿,口碑两极分化,又一部DC电影扑街了
2020/04/09 欧美动漫
DC宇宙的第一个英雄,堪称动漫史鼻祖,如今成为美国文化的象征
2020/04/09 欧美动漫
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
PHP使用正则表达式清除超链接文本
2013/11/12 PHP
PHP针对多用户实现更换头像功能
2016/09/04 PHP
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
Javascript 垃圾收集机制介绍理解
2013/05/14 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
在Mac OS下使用Node.js的简单教程
2015/06/24 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
vue v-on监听事件详解
2017/05/17 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
AngularJS使用Filter自定义过滤器控制ng-repeat去除重复功能示例
2018/04/21 Javascript
微信小程序踩坑记录之解决tabBar.list[3].selectedIconPath大小超过40kb
2018/07/04 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
详解在Vue.js编写更好的v-for循环的6种技巧
2020/04/14 Javascript
Vue3 实现双盒子定位Overlay的示例
2020/12/22 Vue.js
Python操作csv文件实例详解
2017/07/31 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
python实现人民币大写转换
2018/06/20 Python
Python 数值区间处理_对interval 库的快速入门详解
2018/11/16 Python
python 函数内部修改外部变量的方法
2018/12/18 Python
Pycharm 2019 破解激活方法图文详解
2019/10/11 Python
Python List列表对象内置方法实例详解
2019/10/22 Python
详解python 中in 的 用法
2019/12/12 Python
Python PIL库图片灰化处理
2020/04/07 Python
python中二分查找法的实现方法
2020/12/06 Python
今天学到的CSS最新技术(与图片背景相关)
2012/12/24 HTML / CSS
泰国在线书店:SE-ED
2020/06/21 全球购物
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
小学生检讨书大全
2014/02/06 职场文书
中级会计职业生涯规划书
2014/03/01 职场文书
机械系毕业生求职信
2014/05/28 职场文书
“三支一扶”支教教师思想汇报
2014/09/13 职场文书
标准版个人借条怎么写?以及什么是借条?
2019/08/28 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python