摘要:截止到目前年月日為止,開(kāi)源庫(kù)中沒(méi)有找到可以支持的組件,所以在最新的版本中支持這一特性。所謂的大表格虛擬化,其實(shí)就是為表格設(shè)置一個(gè)較大的數(shù)據(jù)比如條數(shù)據(jù),然后虛擬一個(gè)表格隱藏掉不需要顯示的數(shù)據(jù)。在組件之前的版本中,渲染的樹(shù)形表格的結(jié)構(gòu)是一棵。
背景
有這樣一個(gè)需求,一位 React Suite(以下簡(jiǎn)稱 rsuite)的用戶,他需要一個(gè) Table 組件能夠像 Jira Portfolio 一樣,支持樹(shù)形數(shù)據(jù),同時(shí)需要支持大數(shù)據(jù)渲染。 截止到目前(2019年1月18日)為止,開(kāi)源 UI 庫(kù)中沒(méi)有找到可以支持的組件,所以 rsuite 在最新的版本中支持這一特性。
接下來(lái),我們看一下 rsuite 中是怎么支持這兩個(gè)功能?
大表格虛擬化首先,我們看一下支持大數(shù)據(jù)渲染,在頁(yè)面中渲染過(guò)多的 DOM 元素會(huì)帶來(lái)性能問(wèn)題,必須得有一種解決方案去優(yōu)化它,我們暫且叫做大表格虛擬化。
所謂的大表格虛擬化,其實(shí)就是為表格設(shè)置一個(gè)較大的數(shù)據(jù)(比如 10000 條數(shù)據(jù)),然后虛擬一個(gè)表格隱藏掉不需要顯示的數(shù)據(jù)。
為了解決讓瀏覽器渲染的大量 DOM 時(shí)候出現(xiàn)的性能問(wèn)題,我們不能把 10000 條數(shù)據(jù)都渲染到頁(yè)面,采用一種方式,只渲染可視范圍內(nèi)數(shù)據(jù)。 同時(shí)為表格設(shè)置一個(gè)滾動(dòng)條,只有在滾動(dòng)到需要顯示的區(qū)域時(shí)候才渲染該區(qū)域的數(shù)據(jù),減少的 DOM 數(shù)量。
預(yù)覽地址
以上這是一個(gè) 10000 條數(shù)據(jù)的 Table,渲染后的 HTML 結(jié)構(gòu)是:
我們可以看到在 Table 中只渲染了 14 個(gè) rs-table-row ,其中第一個(gè)和最后一個(gè)是沒(méi)有 children, 只是一個(gè)擁有高度的占位符。 每一個(gè) rs-table-row 都是絕對(duì)定位,所以即使 Table 中刪除一個(gè) Row, 或者新增一個(gè) Row ,也不會(huì)改變其他 Row 的位置。 在這樣的基礎(chǔ)上,通過(guò)獲取滾動(dòng)條的滾動(dòng)的位置,就很容易判斷當(dāng)前 Row 的 top 值是否在 Table 的可視范圍內(nèi),同時(shí)更新所有的 Row。
很多優(yōu)秀的庫(kù)都實(shí)現(xiàn)了這樣的功能,原理基本一致,比如 react-virtualized 就提供 Table 組件,但是他不支持 Tree。
樹(shù)形表格在表格中展示樹(shù)形數(shù)據(jù)的需求,我們見(jiàn)得比較多就像甘特圖表格展示那樣。它有子父層級(jí)關(guān)系,可以展開(kāi)子節(jié)點(diǎn)。
這樣一個(gè)表格,很多 Table 組件都支持,但是如果同時(shí)需要支持虛擬化就相對(duì)比較麻煩,因?yàn)樵谡归_(kāi)關(guān)閉節(jié)點(diǎn)的時(shí)候需要重新計(jì)算顯示的 DOM 以及設(shè)置滾動(dòng)條的位置。
在 rsuite Table 組件之前的版本中,渲染的樹(shù)形表格的 DOM 結(jié)構(gòu)是一棵 Tree。 所以首先需要把 Tree 拍平,轉(zhuǎn)換一個(gè)一維數(shù)組,為每一個(gè)節(jié)點(diǎn)設(shè)置父節(jié)點(diǎn),通過(guò)父節(jié)點(diǎn)的深度渲染 Tree 節(jié)點(diǎn)的相對(duì)位置。 然后就比較好處理,只需要在點(diǎn)擊展開(kāi)關(guān)閉節(jié)點(diǎn)按鈕的時(shí)候,處理好數(shù)據(jù)的過(guò)濾。
安裝與使用rsuite 的 Table 組件的設(shè)計(jì),對(duì)開(kāi)發(fā)還是非常方便,通過(guò) 安裝 示例代碼: 最后,對(duì)于一個(gè)成熟的 Table 組件怎么能只有這點(diǎn)功能,所以它還支持: 自定義調(diào)整列寬 鎖定列 自動(dòng)換行 排序 分頁(yè) 編輯 合并單元格 自定義單元格 自動(dòng)列寬 可展開(kāi)行 剩下唯一的問(wèn)題,就是您是否在項(xiàng)目中嘗試它。 文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。 轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/101266.html 摘要:接下來(lái)來(lái)看一下是如何編寫(xiě)一個(gè)組件的,在看源碼之前,首先還是要對(duì)他的組件的大致功能有一個(gè)了解,這樣我們?cè)诳丛创a的時(shí)候才會(huì)知道這一段大概實(shí)現(xiàn)了什么功能。最后我實(shí)現(xiàn)的功能文檔以及最終的一個(gè)樣例
在你實(shí)現(xiàn)一個(gè)組件過(guò)程中,一定要注意一下幾點(diǎn)
將代碼模塊化并且分離。如果你將大量的邏輯或者是代碼都放在鉤子函數(shù)中(比如mounted),那么寫(xiě)出來(lái)的組件代碼將非常丑陋,這樣子寫(xiě)出的代碼也往往難以維護(hù)。... 摘要:一封裝的組件定義表格高度全屏增加前臺(tái)分頁(yè)功能。表格內(nèi)編輯后,自動(dòng)選中該行。單元格內(nèi)數(shù)據(jù)樣式單元格內(nèi)按鈕,可多個(gè)。觸發(fā)組件綁定函數(shù),參數(shù)按鈕名稱,按鈕樣式,按鈕事件標(biāo)識(shí)。單元格是否可點(diǎn)擊的判斷函數(shù),可進(jìn)行復(fù)雜的函數(shù)判斷。
vue-bxz-table
一、封裝element-ui的table組件:
定義表格高度全屏
增加前臺(tái)分頁(yè)功能。
自定義表頭,循環(huán)輸出整體表結(jié)構(gòu)。
表格內(nèi)編輯(輸入框... 摘要:作者注是基于擴(kuò)展的原生表格插件,設(shè)計(jì)理念來(lái)源于的組件該庫(kù)基于,暫時(shí)未找到版本因此在此造輪子。本文將記錄系列所有組件開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和解決思路,歡迎討論和指正。
作者注:jsu.Table是基于jQuery擴(kuò)展的原生表格插件,設(shè)計(jì)理念來(lái)源于Element.ui的Table組件(該UI庫(kù)基于vue.js,暫時(shí)未找到j(luò)Query版本因此在此造輪子)。本文將記錄jsu系列所有組件開(kāi)發(fā)過(guò)程... 摘要:作者注是基于擴(kuò)展的原生表格插件,設(shè)計(jì)理念來(lái)源于的組件該庫(kù)基于,暫時(shí)未找到版本因此在此造輪子。本文將記錄系列所有組件開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和解決思路,歡迎討論和指正。
作者注:jsu.Table是基于jQuery擴(kuò)展的原生表格插件,設(shè)計(jì)理念來(lái)源于Element.ui的Table組件(該UI庫(kù)基于vue.js,暫時(shí)未找到j(luò)Query版本因此在此造輪子)。本文將記錄jsu系列所有組件開(kāi)發(fā)過(guò)程... 摘要:作者注是基于擴(kuò)展的原生表格插件,設(shè)計(jì)理念來(lái)源于的組件該庫(kù)基于,暫時(shí)未找到版本因此在此造輪子。本文將記錄系列所有組件開(kāi)發(fā)過(guò)程中遇到的問(wèn)題和解決思路,歡迎討論和指正。
作者注:jsu.Table是基于jQuery擴(kuò)展的原生表格插件,設(shè)計(jì)理念來(lái)源于Element.ui的Table組件(該UI庫(kù)基于vue.js,暫時(shí)未找到j(luò)Query版本因此在此造輪子)。本文將記錄jsu系列所有組件開(kāi)發(fā)過(guò)程... 閱讀 1385·2021-10-19 11:42 閱讀 726·2021-09-22 16:04 閱讀 1878·2021-09-10 11:23 閱讀 1855·2021-07-29 14:48 閱讀 1256·2021-07-26 23:38 閱讀 2819·2019-08-30 15:54 閱讀 1032·2019-08-30 11:25 閱讀 1702·2019-08-29 17:23、
npm install rsuite --save
如果你在項(xiàng)目只希望用到 Table, 不想安裝整個(gè) rsuite 庫(kù),你可以多帶帶安裝 rsuite-table
import { Table } from "rsuite";
const { Column, HeaderCell, Cell } = Table;
const data = [{ id: 1, name: "foobar", email: "foobar@xxx.com" }];
ReactDOM.render(
);
最后
相關(guān)文章
從源碼看Element UI Table組件實(shí)現(xiàn)思路
vue封裝element-ui的table組件,靈活配置表頭實(shí)現(xiàn)表格內(nèi)編輯,按鈕,鏈接等功能。
jsu系列之表格組件 ---- jsu.Table
jsu系列之表格組件 ---- jsu.Table
jsu系列之表格組件 ---- jsu.Table
發(fā)表評(píng)論
0條評(píng)論
shenhualong
男|高級(jí)講師
TA的文章
閱讀更多
Toxic-Host:羅馬尼亞VPS / 羅馬尼亞VDS 服務(wù)器起價(jià)每臺(tái) $1.50/月起,羅馬尼亞
虛擬主機(jī)的意思是什么-服務(wù)器與虛擬主機(jī)有什么區(qū)別?
BuyVM新增解鎖流媒體VPS主機(jī),1Gbps不限流量$5/月起
SugarHosts糖果主機(jī)云服務(wù)器管理 安裝系統(tǒng)/備份/快照/防火墻
騰訊云618活動(dòng),老用戶云服務(wù)器續(xù)費(fèi)3折,新用戶2核4G內(nèi)存5M帶寬488元/年
前端每日實(shí)戰(zhàn):66# 視頻演示如何用純 CSS 創(chuàng)作一臺(tái)咖啡機(jī)
html5 autocomplete='off' 解決 Chrome瀏覽器取消i
FE.ES-理解ECMA Javascript作用域