使用React簡短代碼動態生成柵格佈局

来源:https://www.cnblogs.com/Dotnet9-com/archive/2020/05/24/12945555.html
-Advertisement-
Play Games

使用React簡短代碼動態生成柵格佈局 作為 TerminalMACS 的一個子進程模塊 React Web管理端,使用Ant Design Pro作為框架。 本文應用到的知識 1.樣式文件less中方法的使用 2.for迴圈創建按鈕和柵格佈局(flex佈局) 1. 最終效果及源碼鏈接 作為前端新手 ...


使用React簡短代碼動態生成柵格佈局

作為 TerminalMACS 的一個子進程模塊 - React Web管理端,使用Ant Design Pro作為框架。

本文應用到的知識

  • 1.樣式文件less中方法的使用
  • 2.for迴圈創建按鈕和柵格佈局(flex佈局)

1. 最終效果及源碼鏈接

作為前端新手的我,做下麵這個簡單功能花了好幾天時間,問了不少前端大佬(大佬們應該要不到半個小時,慚愧慚愧),現在回想問的問題都很基礎(有點丟人,哈哈),多謝了哦。

先看看效果

點擊瀏覽源碼:開源項目對應源碼

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. 關於項目開源

5. 技術交流

可在 dotnet9 網站留言,網站頁腳有本人微信號、微信公眾號等。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 倒排索引的初衷 倒排索引,它也是索引。索引,初衷都是為了快速檢索到你要的數據。 我相信你一定知道mysql的索引,如果對某一個欄位加了索引,一般來說查詢該欄位速度是可以有顯著的提升。 每種資料庫都有自己要解決的問題(或者說擅長的領域),對應的就有自己的數據結構,而不同的使用場景和數據結構,需要用不同 ...
  • @[TOC](總計和小計、逐行累計求和)### 一、總計和小計使用函數#### 1、rollupgroup by 我們都知道,是一個分組函數,用於針對某一列做分組操作。但是當它搭配其他的函數一起使用的時候,就像一對男女孩,撞出不一樣的火花。==rollup(欄位1,欄位2,.....) rollup ...
  • 從邏輯上看:描述信息的數據存在資料庫中並由DBMS統一管理 從物理上看:描述信息的數據事宜文件的方式存儲在物理磁碟上 資料庫文件分為: 1.數據文件:存放資料庫數據和數據倉庫對象的文件 主要數據文件(.mdf)+次要數據文件(.ndf) 主要數據文件只能有一個,存放資料庫的啟動信息和數據,次要文件存 ...
  • 關係代數 抽象的查詢語言,用關係運算表達查詢 運算對象:關係 運算結果:關係 傳統關係運算(集合關係運算) 1.並運算(υ) RυS:兩個關係放在一起,消去重覆部分 2.交運算(∩) R∩S:兩個關係的重覆部分 3.差運算(-) R-S:表示屬於R但不屬於S的部分,即R中取出R與S的交集部分 R-S ...
  • 一套代碼達到以下效果: 打包不同applicationId能同時安裝在同一手機上 不同logo,app名稱, 不同第三方SDK接入配置(例如微信分享appid,激光推送appkey) 能區分debug和release配置 使用到的功能:productFlavor和buildTypes 原理:優先順序b ...
  • 最近忙的很久沒寫點啥了,哪怕寫一寫沒什麼價值的東西,也能體現出我還活著,不要板shi了,寫過的東西寫了一遍又一遍,呆zhi; 設置button的圖片與文字位置,用系統自帶的控制其實也可以; .h typedef NS_ENUM(NSUInteger, KLXKLayoutButtonStyle) { ...
  • 背景: 最近在做一個關於android的續航時間測試apk,從開始測試記錄時間到低電自動關機時這整個的時間,當前採用監聽關機廣播的來實際統計續航時間,但遇到的問題是同樣的測試apk在android8及以下系統均能正常監聽到關機廣播,但從android 9開始就監聽不到關機廣播了。 下麵是我的監聽廣播 ...
  • 今天新蘋果機安裝cocoapods,安裝完以後發現怎麼pod search 都沒有用 命令行提示: swhcxp@iosdevmac ~ % pod search Almofire Setup completed [!] Unable to find a pod with name, author, ...
一周排行
    -Advertisement-
    Play Games
  • C#TMS系統代碼-基礎頁面BaseCity學習 本人純新手,剛進公司跟領導報道,我說我是java全棧,他問我會不會C#,我說大學學過,他說這個TMS系統就給你來管了。外包已經把代碼給我了,這幾天先把增刪改查的代碼背一下,說不定後面就要趕鴨子上架了 Service頁面 //using => impo ...
  • 委托與事件 委托 委托的定義 委托是C#中的一種類型,用於存儲對方法的引用。它允許將方法作為參數傳遞給其他方法,實現回調、事件處理和動態調用等功能。通俗來講,就是委托包含方法的記憶體地址,方法匹配與委托相同的簽名,因此通過使用正確的參數類型來調用方法。 委托的特性 引用方法:委托允許存儲對方法的引用, ...
  • 前言 這幾天閑來沒事看看ABP vNext的文檔和源碼,關於關於依賴註入(屬性註入)這塊兒產生了興趣。 我們都知道。Volo.ABP 依賴註入容器使用了第三方組件Autofac實現的。有三種註入方式,構造函數註入和方法註入和屬性註入。 ABP的屬性註入原則參考如下: 這時候我就開始疑惑了,因為我知道 ...
  • C#TMS系統代碼-業務頁面ShippingNotice學習 學一個業務頁面,ok,領導開完會就被裁掉了,很突然啊,他收拾東西的時候我還以為他要旅游提前請假了,還在尋思為什麼回家連自己買的幾箱飲料都要叫跑腿帶走,怕被偷嗎?還好我在他開會之前拿了兩瓶芬達 感覺感覺前面的BaseCity差不太多,這邊的 ...
  • 概述:在C#中,通過`Expression`類、`AndAlso`和`OrElse`方法可組合兩個`Expression<Func<T, bool>>`,實現多條件動態查詢。通過創建表達式樹,可輕鬆構建複雜的查詢條件。 在C#中,可以使用AndAlso和OrElse方法組合兩個Expression< ...
  • 閑來無聊在我的Biwen.QuickApi中實現一下極簡的事件匯流排,其實代碼還是蠻簡單的,對於初學者可能有些幫助 就貼出來,有什麼不足的地方也歡迎板磚交流~ 首先定義一個事件約定的空介面 public interface IEvent{} 然後定義事件訂閱者介面 public interface I ...
  • 1. 案例 成某三甲醫預約系統, 該項目在2024年初進行上線測試,在正常運行了兩天後,業務系統報錯:The connection pool has been exhausted, either raise MaxPoolSize (currently 800) or Timeout (curren ...
  • 背景 我們有些工具在 Web 版中已經有了很好的實踐,而在 WPF 中重新開發也是一種費時費力的操作,那麼直接集成則是最省事省力的方法了。 思路解釋 為什麼要使用 WPF?莫問為什麼,老 C# 開發的堅持,另外因為 Windows 上已經裝了 Webview2/edge 整體打包比 electron ...
  • EDP是一套集組織架構,許可權框架【功能許可權,操作許可權,數據訪問許可權,WebApi許可權】,自動化日誌,動態Interface,WebApi管理等基礎功能於一體的,基於.net的企業應用開發框架。通過友好的編碼方式實現數據行、列許可權的管控。 ...
  • .Net8.0 Blazor Hybird 桌面端 (WPF/Winform) 實測可以完整運行在 win7sp1/win10/win11. 如果用其他工具打包,還可以運行在mac/linux下, 傳送門BlazorHybrid 發佈為無依賴包方式 安裝 WebView2Runtime 1.57 M ...