動態渲染可編輯單元格的Table

来源:https://www.cnblogs.com/xiao-pengyou/archive/2019/03/27/10605011.html
-Advertisement-
Play Games

一、問題描述 問題是這樣的,後臺傳了xArr = [x1, x2,...,xn]和yArr = [y1, y2, ..yn]兩個數組,前端要渲染出表格並且可以填寫每個單元格的值,然後按照一定數據結構保存並傳給後臺,並且再次獲取這個數據結構和數組xArr、yArr可以自己渲染出這個表?實現新增和修改的 ...


 

     一、問題描述

          問題是這樣的,後臺傳了xArr = [x1, x2,...,xn]和yArr = [y1, y2, ..yn]兩個數組,前端要渲染出表格並且可以填寫每個單元格的值,然後按照一定數據結構保存並傳給後臺,並且再次獲取這個數據結構和數組xArr、yArr可以自己渲染出這個表?實現新增和修改的功能。大致界面效果如下圖所示:

y1, y2,...,yn作為列名,x1,x2, ..., xn作為第一列數據,此業務模型是一種常見的表格,只不過要求行列都不固定,由後臺數據提供並且動態生成。還要能夠實現修改功能。本質上是一個動態渲染可編輯Table的問題。難點在於動態構建表格並且實現數據展示和保存。

 

二、解決思路

      (1)數據轉換成表格後,處理起來就簡單了,如果以常見的Table組件為例,只需要構建columns和dataSource兩個數組數據即可渲染出表格;

      (2)渲染出表格後,表格每一個餘下的單元格都要可輸入,可以考慮單元格利用render渲染出Input組件,通過Input的操作onChange或onBlur去改變數據並存儲。

      (3)數組是引用類型,可以利用引用類型只要沒有深拷貝或改變指針指向記憶體地址就不變的原理,方便記錄操作後的數據。

 

三、解決方法(以React結合ant design UI的Table組件為例):

       (1)動態構建columns(表格列數據)和dataSource(表格數據源)渲染出表格。(Table可參考 https://ant.design/components/table-cn/#header)

 1 const xArr = ['x1', 'x2', 'x3', 'x4'];
 2 const dataSource = xArr.map((v, i) => ({
 3      key: String(i),//此處自定義表格每一行的唯一key,如果沒有設置唯一標誌會報錯
 4      y0: v,//第一列數據即顯示X1-Xn的那一列
 5 }));
 6 
 7 const yArr = ['y1', 'y2', 'y3', 'y4', 'Y5'];
 8 const columns = [{
 9     title: ' ',
10     dataIndex: 'y0',//第一列y0為列的dataIndex,用於顯示x1-xn
11 }, ...yArr.map(item => ({//其他列通過yArr迴圈得到,並用...解構直接合併為columns
12     title: item,
13     dataIndex: item,
14 }))];

這樣就得到形如dataSource = [{ key: '0', y0:'x1'}, { key: '0', y0:'x1'},...];  columns = [{ title: '', dataIndex: 'y0'},{ title: 'y1', dataIndex: 'y1'},...];的表格數據,將此數據源傳入表格組件Table,即可渲染出表格如下:

<Table columns={columns} dataSource={dataSource} />

(2)表格添加Input並且根據onChange/onBlur事件動態記錄dataSource的變化。

 1 const columns = [{
 2       title: ' ',
 3       dataIndex: 'y0',
 4     }, ...yArr.map(item => ({
 5       title: item,
 6       dataIndex: item,
 7       render: (text, record) => (
 8         <Input defaultValue={record[item]} onChange={(e) => { record[item] = e.target.value; }} />
 9       ),
10     }))];

渲染效果如下:

四、完整代碼

/**
 * @author  xiao-pengyou
 * @create date 2019-03-27
 * @desc 動態可編輯表格
* */

import React, { PureComponent } from 'react';
import { Table, Input } from 'antd';

export default class Demo extends PureComponent {
  state = { dataSource: [] };

  componentDidMount() {
    const xArr = ['x1', 'x2', 'x3', 'x4'];
    const dataSource = xArr.map((v, i) => ({key: String(i),y0: v}));
    this.setState({ dataSource });//dataSource不能在render裡面構建,在render裡面構建每次重新渲染的時候dataSource會被重新構建,指針指向變化導致先前的修改不能被跟蹤
  }

  render() {
    const yArr = ['y1', 'y2', 'y3', 'y4', 'y5'];
    const that = this;//定義中間量that=this確保columns內部onChange事件作用域為當前組件,方便調用forceUpdate()強制渲染表格
    const columns = [{
      title: ' ',
      dataIndex: 'y0',
    }, ...yArr.map(item => ({
      title: item,
      dataIndex: item,
      render: (text, record) => (
        <Input value={record[item]} onChange={(e) => { record[item] = e.target.value; that.forceUpdate(); }} />
      ),
    }))];//最終的dataSource就是我們想要的數據結構,修改時直接把這個dataSource傳給構建的表格就可以渲染
    return <Table columns={columns} dataSource={this.state.dataSource} bordered pagination={false} />;//bordered設置邊框,pagination=false取消分頁功能,可以不用在意此參數
  }
}

  最終效果(控制台輸出為提交給後臺的dataSource數組):

以上就是一個動態列的可編輯表格的React實現方式。如有問題歡迎留言批評指正,謝謝!

 本文為原創博客,非法抄襲或複製將追究法律責任,轉載請註明出處:https://www.cnblogs.com/xiao-pengyou/

 


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

-Advertisement-
Play Games
更多相關文章
  • 背景 在13年的時候,我開始負責整個公司的搜索引擎。嗯……,不是很牛的那種大項目負責人。而是整個搜索就我一個人做。哈哈。 後來跳槽之後,所經歷的團隊都用Elasticsearch,基本上和緩存一樣,是項目必備的工具。目前靜兒在做的項目中也在用,正好系統學習一下。畢竟靜兒的夢想就是打造自己的搜索引擎。 ...
  • 1、背景&解決方法 最近碰到一個需求,app監聽特定的廣播,接收到廣播後啟動自己再進行處理。需求很簡單,靜態註冊就好,不過,在自測的時候遇到一個問題,app安裝後沒啟動過的狀態下,什麼廣播都收不到!なにもない! 後來,網上各種查,找到了“罪魁禍首”:Android 3.1以後新增的stopped機制 ...
  • 在大多單位的引流或業務操作中,基本上都需要使用安卓的高端技術Xposed框架,近期,我們單位購買了一批新的安卓4.0以上系統,基本上都都是基於7.0以上版本,基本上都不能夠刷入root超級許可權,即便是一部分能但較為麻煩,甚至也有刷入root超級許可權後重啟設備就恢復無root狀態的情況出現,很是頭疼的 ...
  • 在大多運行室的引流或者業務操作中,理論上需要使用安卓的神一般的Xposed框架,上周我們運行室購來了一批新的vivo機器,理論上都是基於7.0以上系統版本,理論上不能夠獲得root的su許可權,雖然一部分能但非常麻煩,甚至也有獲得root的su許可權後重啟設備就恢復無root狀態的情況出現,很是焦慮的一 ...
  • App瘦身 資源瘦身 使用tinypng壓縮PNG圖片。視頻可以通過 Final cut等軟體進行解析度壓縮。音頻則降低碼率即可。 非必須資源文件可以放到自己伺服器上 啟動圖使用 LaunchScreen.storyboard,啟動圖在一個項目資源中占比其實蠻大的,但是使用 LaunchScreen ...
  • 前言 在iOS中,NSTimer的使用是非常頻繁的,但是NSTimer在使用中需要註意,避免迴圈引用的問題。之前經常這樣寫: - (void)setupTimer { self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self ...
  • 在越來越多應用室的引流,或業務操作中,大多數需要使用安卓的強大Xposed框架,前幾天,我們應用室採購了一批新的vivo4.0系統,大多數都是基於7.0以上系統,大多數不能夠刷入Root的su許可權,即使一些可以但非常麻煩,甚至也有刷入Root的su許可權後重啟設備就恢復無Root狀態的情況發生,很是頭 ...
  • 在前端開發中,許多新手常會遇見一個問題,參考的網頁上有類似下圖的圖標,但在資源里卻找不到對應的文件,這是因為這些網頁使用了圖標庫。這裡介紹一種常見的圖標庫——FontAwesome的使用。 1.登錄Font Awesome官網,下載Font Awesome安裝包,最好下載最新版本的,因為最新版本中的 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...