使用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下有关dom以及xml节点访问兼容问题
Nov 26 Javascript
提示$ is not defined错误分析及解决
Apr 09 Javascript
jquery 倒计时效果实现秒杀思路
Sep 11 Javascript
node.js中的path.join方法使用说明
Dec 08 Javascript
Java中Timer的用法详解
Oct 21 Javascript
基于Bootstrap+jQuery.validate实现表单验证
May 30 Javascript
让你一句话理解闭包(简单易懂)
Jun 03 Javascript
JavaScript轮播图简单制作方法
Feb 20 Javascript
如何手动实现es5中的bind方法详解
Dec 07 Javascript
jQuery位置选择器用法实例分析
Jun 28 jQuery
JS实现简易计算器
Feb 14 Javascript
Axios代理配置及封装响应拦截处理方式
Apr 07 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
php实现utf-8和GB2312编码相互转换函数代码
2013/02/07 PHP
必须收藏的23个php实用代码片段
2016/02/02 PHP
php简单生成一组与多组随机字符串的方法
2017/05/09 PHP
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
Extjs TriggerField在弹出窗口显示不出问题的解决方法
2010/01/08 Javascript
基于jsTree的无限级树JSON数据的转换代码
2010/07/27 Javascript
基于jQuery实现的文字按钮表单特效整理
2014/12/07 Javascript
jQuery中:enabled选择器用法实例
2015/01/04 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
老生常谈Bootstrap媒体对象
2017/07/06 Javascript
用vue写一个仿简书的轮播图的示例代码
2018/03/13 Javascript
Vue中在新窗口打开页面及Vue-router的使用
2018/06/13 Javascript
vue中子组件调用兄弟组件方法
2018/07/06 Javascript
Vue axios 将传递的json数据转为form data的例子
2019/10/29 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
基于vue与element实现创建试卷相关功能(实例代码)
2020/12/07 Vue.js
JavaScript canvas实现文字时钟
2021/01/10 Javascript
python之wxPython应用实例
2014/09/28 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
pandas 数据索引与选取的实现方法
2019/06/21 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
2019/10/14 Python
python将时分秒转换成秒的实例
2019/12/07 Python
TensorFLow 数学运算的示例代码
2020/04/21 Python
浅谈Python 命令行参数argparse写入图片路径操作
2020/07/12 Python
pip install命令安装扩展库整理
2021/03/02 Python
卡西欧G-SHOCK英国官网: 防水防震手表
2018/01/08 全球购物
Jack Rogers官网:美国经典的女性鞋靴品牌
2019/09/04 全球购物
Ajxa常见问题都有哪些
2014/03/26 面试题
科室工作的个人自我评价
2013/10/30 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
人事局接收函
2015/01/31 职场文书
体育教师个人总结
2015/02/09 职场文书
初中体育课教学反思
2016/02/16 职场文书
我去timi了,一起去timi是什么意思?
2022/04/13 杂记