使用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 相关文章推荐
TextArea不支持maxlength的解决办法(jquery)
Sep 13 Javascript
javascript抖动元素的小例子
Oct 28 Javascript
Angular2学习教程之组件中的DOM操作详解
May 28 Javascript
结合mint-ui移动端下拉加载实践方法总结
Nov 08 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
Mar 02 Javascript
浅谈Node 调试工具入门教程
Mar 20 Javascript
JS正则表达式常见用法实例详解
Jun 19 Javascript
Vue插件打包与发布的方法示例
Aug 20 Javascript
JS对象和字符串之间互换操作实例分析
Feb 02 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
Aug 09 Javascript
vue iview实现动态新增和删除
Jun 17 Javascript
Node.js 中如何收集和解析命令行参数
Jan 08 Javascript
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
PHP与SQL注入攻击[一]
2007/04/17 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
php 二维数组时间排序实现代码
2016/11/19 PHP
PHP面向对象之里氏替换原则简单示例
2018/04/08 PHP
javascript Object与Function使用
2010/01/11 Javascript
jquery下onpropertychange事件的绑定方法
2010/08/01 Javascript
javascript中的继承实例代码
2011/04/27 Javascript
Seajs的学习笔记
2014/03/04 Javascript
javascript页面上使用动态时间具体实现
2014/03/18 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
2015/03/04 Javascript
15个常用的jquery代码片段
2015/12/19 Javascript
jQuery+canvas实现的球体平抛及颜色动态变换效果
2016/01/28 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
最全的JavaScript开发工具列表 总有一款适合你
2017/06/29 Javascript
浅谈angularJS的$watch失效问题的解决方案
2017/08/11 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
详解puppeteer使用代理
2018/12/27 Javascript
vue3.0实现插件封装
2020/12/14 Vue.js
[55:23]VGJ.T vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
[15:20]DOTA2-DPC中国联赛 正赛 Elephant vs Aster 选手采访
2021/03/11 DOTA
python中模块查找的原理与方法详解
2017/08/11 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
Python列表删除元素del、pop()和remove()的区别小结
2019/09/11 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
用python中的matplotlib绘制方程图像代码
2019/11/21 Python
Python实现对adb命令封装
2020/03/06 Python
Django模板标签中url使用详解(url跳转到指定页面)
2020/03/19 Python
Python多线程通信queue队列用法实例分析
2020/03/24 Python
解决pip安装tensorflow中出现的no module named tensorflow.python 问题方法
2021/02/20 Python
基督教卡片、励志礼品、家居装饰等:DaySpring
2018/10/12 全球购物
销售经理工作职责范文
2013/12/03 职场文书
目标管理责任书
2014/04/15 职场文书
考生诚信考试承诺书
2015/04/29 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
68行Python代码实现带难度升级的贪吃蛇
2022/01/18 Python