"時序圖"-->先簡單解釋一下,忽然接到任務要求作一個時序圖(後面會附上參考圖片),因爲需求不是很完善,設計也還沒給出圖紙,暫時就先作一個知足基本功能的demo。javascript
需求整理:html
暫時的需求整理結束,下面來看看實現上遇到的一些問題,及解決方法。 注:前端
判斷一個主任務的時刻步長:java
step = (主任務結束時間 - 主任務開始時間)/3
// 這裏爲何是除以3呢?好比從12:00 - 15:00(12:00爲刻度1,12 + step,12 + 2step, 15:00)
複製代碼
注: 實現的代碼有點長,所有貼出來的話閱讀會比較困難,因此我會貼出一些重要的部分,以及遇到問題的部分。node
按照antd給出的示例去引入Tree組件,而後給參數添加類型。react
public renderTree = () => {
return (
// (JSX attribute) loadData?: ((node: AntTreeNode) => PromiseLike<any>) | undefined
<Tree className="tree-box" loadData={this.onLoadData}>
{this.renderTreeNodes(this.state.treeData)}
</Tree>
);
}
複製代碼
使用TreeNodes加載數據的話,ts裏會遇到一個這樣的報錯提示:前端工程師
AntTreeNode上不存在dataRef,這時我選擇去Tree.d.ts裏面的AntTreeNodeProps接口裏本身定義一個antd
dataRef: Partial<{children?: React.ReactNode}>;
複製代碼
在咱們的組件裏還須要這樣去定義:性能
interface IRef extends AntTreeNodeProps{
dataRef: Partial<{children?: React.ReactNode}>;
}
// 由於咱們的TreedNode是一個組件類型,咱們須要在組件上注入dataRef這樣在使用TreeNode時就不會有錯誤提示了
const TreeNode = Tree.TreeNode as React.ComponentClass<IRef>;
複製代碼
這裏算是antd對ts寫做支持的一個遺漏。好了ts的問題就到這裏。大數據
使用TreeNode時咱們發現他的Title屬性支持ReactNode,那麼咱們的進度條能夠利用這個屬性去顯示。進度條的位置能夠利用子任務的開始時間去判斷。
antd Tree組件的子組件都是塊級元素,而且爲了表示層級,antd裏treeNode都有一個固定的padding:0,0,0,18px,咱們設置左側任務名字的最大長度爲400px.那麼咱們能夠計算一下treeNode的長度:
400 - (index - 1) * 18 // 第一層的tree Node 的index爲1,第一層的tree Node 的index爲2,第一層的tree Node 的index爲3以此類推。
複製代碼
解釋: 子任務無論是串行仍是並行,咱們這裏先不作考慮,由於子任務開始時會記錄它開始的時間段,咱們只須要用它結束的時間段,和開始的時間段就能夠知道任務的運行時長,以及子任務所佔主任務的比例,經過比例咱們能夠設定它不一樣的顏色及狀態。
(子任務結束時間 - 子任務開始時間) / (主任務結束時間 - 主任務開始時間) * (屏幕寬度 - 400)
// 400任務名所佔的最大寬度
複製代碼
// color 設置子任務的顏色。
public color = {
done: '#52c41a',
failed: '#f5222d',
running: '#1890ff'
};
public running_color = (max: number, min: number, item_width: number, color: string) => {
if (min < item_width && item_width <= max) {
this.color.running = color;
}
}
// 經過運行狀態取判斷子任務的顏色
if (item.status === 'running') {
this.running_color(total_width, 0, item_width, '#b0afcc');
this.running_color((total_width * 2), total_width, item_width, '#7e7bc9');
this.running_color((total_width * 3), (total_width * 2), item_width, '#3a34c9');
this.running_color((total_width * 4), (total_width * 3), item_width, '#1427e1');
}
else this.progress_color = this.color[item.status];
複製代碼
原文連接:tech.gtxlab.com/react-tree.…
做者信息:寧文飛,人和將來大數據前端工程師