成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

動態刻度可視化組件實現

大數據 數據可視化
之前有個網友問我了一個很有價值的問題,筆者思考了一下決定自己實現一個動態刻度可視化組件的方案, 來解決這一類的需求.

前言

之前有個網友問我了一個很有價值的問題, 有關實現數據可視化的問題, 但是這個可視化問題不是一般的柱狀圖, 折現圖之類的,而是不規則刻度的數據可視化.所以筆者思考了一下決定自己實現一個動態刻度可視化組件的方案, 來解決這一類的需求.

正文

最初的需求是這樣的:

我們只需要輸入文字, 數值比例, 就能生成如上圖所示的刻度圖.但是作為一名有追求的程序員, 需要對問題抽象化, 形成通用的解決方案,所以我們開始重組需求:

由上圖我們可以拆解為一下幾個需求點:

  • 支持數值自定義
  • 數值單位自定義
  • 支持刻度組件寬度自定義
  • 支持刻度線數量自定義
  • 支持刻度變化幅度自定義
  • 傳入已有進度比例,即激活區范圍
  • 支持刻度樣式自定義
  • 支持數值樣式自定義
  • 支持自定義說明文本以及說明文本自定義

以上就是筆者挖掘的通用需求,當然有其他需求也可以漸進的增加.

確認了以上需求之后,我們開始選擇技術選型, 筆者之前常用的技術棧是vue和react,所以接下來我們初步確認該組件采用如下技術方案:

  • react + typescript + umi-library

如果大家擅長使用vue, 也可以, 筆者之前也寫過如何搭建vue的組件庫相關的文章,感興趣可以學習了解一下, 其本質思想是一致的.

接下來我們開始實現動態刻度可視化組件. 如果對umi不熟悉的,可以參考筆者之前寫的文章從0到1教你搭建前端團隊的組件系統(高級進階必備).

1. 定義基本屬性類型

由以上需求分析我們可以定義如下的屬性類型:

  1. export interface TickerProps { 
  2.   width: number; 
  3.   maxHeight: number; 
  4.   percent: number; 
  5.   text: string; 
  6.   value: number; 
  7.   showValue: boolean; 
  8.   unit: string; 
  9.   lineNum: number; 
  10.   defaultColor: string; 
  11.   activeColor: string; 
  12.   textStyle: object; 
  13.   valueStyle: object; 

2. 組件整體結構

  1. const Ticker: React.FC<TickerProps> = function(props:TickerProps) { 
  2.   const { 
  3.     width = 100, 
  4.     maxHeight = 10, 
  5.     percent = 50, 
  6.     value, 
  7.     text = '瞬時能見度'
  8.     showValue = true
  9.     unit = 'M'
  10.     lineNum = 12, 
  11.     defaultColor = '#06c'
  12.     activeColor = 'red'
  13.     valueStyle, 
  14.     textStyle 
  15.   } = props 
  16.   return ( 
  17.     <div className="ticker"
  18.       { 
  19.         showValue && 
  20.         <div className="value" style={valueStyle}> 
  21.           { value || 0 } <span className="unit">{ unit }</span> 
  22.         </div> 
  23.       } 
  24.       <div className="tickerGraph"
  25.         <div className="tickerLine"
  26.            
  27.         </div> 
  28.         <div className="tickerBar"></div> 
  29.       </div> 
  30.       { 
  31.         !!text && <div className="text">{ text }</div> 
  32.       } 
  33.     </div> 
  34.   ); 
  35. }; 
  36.  
  37. export default Ticker; 

3. 視圖搭建

有關刻度可視化我們完全采用dom實現, 所以這里筆者具體分析一下如何實現刻度視圖:

上圖的思路就是用一個個dom來組裝成隨機刻度圖形,所以我們只要利用css實現這個形狀, 也就成功了一半.至于激活狀態,我們會根據傳入的數據量來決定激活范圍,接下來會介紹如何渲染激活的刻度,也就是上圖的紅色區域.

4.特殊功能實現

因為該組件很多功能在搭建結構之后已經實現了, 這里我們唯一關注的就是css和js長度計算的問題, css實現方案有很多, 這里就不具體介紹了, 筆者這里重點介紹一下如何實現指定范圍的隨機高度:

  1. // 生成指定范圍的隨機高度 
  2. const random = (min:number, max:number):number => { 
  3.   return min + Math.random() * (max - min

動態刻度條的隨機高度我們就是利用以上函數實現的, 刻度條內部實現如下:

  1. <div className="tickerLine" style={{borderBottomColor: defaultColor}}> 
  2.   { 
  3.     new Array(lineNum).fill(0).map((item:number, i: number) => { 
  4.       let isActive = (i + 1) <= Math.floor(lineNum * percent / 100) 
  5.       return <span 
  6.                className="tick" 
  7.                style={{ 
  8.                  height: random(3, maxHeight) + 'px'left: (gap + 2) * i + 'px'
  9.                  backgroundColor: isActive ? activeColor : defaultColor 
  10.                 }}> 
  11.              </span> 
  12.     }) 
  13.   } 
  14. </div> 

gap為刻度之間的間距, 由于計算刻度的位置需要一點幾何知識, 公式如下:

  1. W = Lw * lineNum + gap * ( lineNum - 1) 

其中W表示刻度總寬度, Lw為刻度線寬度, lineNum為刻度線數量.

還有一個注意點就是激活態, 筆者使用如下函數來判斷刻度是否具有激活狀態:

  1. let isActive = (i + 1) <= Math.floor(lineNum * percent / 100) 

這塊也非常好理解, 也就是我們傳入的比率乘以線的總數量,即可求出哪些刻度線是需要激活的.

以上細節實現完成之后,我們就可以來實現有點意思的刻度可視化方案啦, 如下展示的demo:

1.可見度測量

2.正態分布模型

3.標尺

4.光柵

5.自定義文本樣式

本文轉載自微信公眾號「趣談前端」

【編輯推薦】

 

責任編輯:姜華 來源: 趣談前端
相關推薦

2017-10-14 13:54:26

數據可視化數據信息可視化

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2014-05-28 15:23:55

Rave

2010-07-30 14:00:41

Flex組件

2010-08-12 13:52:38

Flex組件

2021-10-28 08:42:31

Dooring表單設計器數據可視化

2009-04-21 14:26:41

可視化監控IT管理摩卡

2022-08-26 09:15:58

Python可視化plotly

2014-12-31 16:48:43

Touch touchevent多點觸摸

2021-02-01 22:01:57

Coco工具macOS

2015-08-20 10:06:36

可視化

2021-11-19 08:30:39

H5-Dooring 可視化組件商店

2021-07-27 08:29:33

可視化組件商店H5-Dooring

2017-03-28 14:57:23

kylinsuperset可視化

2019-08-06 10:35:25

Python時間序列可視化

2022-09-29 11:16:21

Python數據可視化

2022-05-16 09:34:17

Python可視化圖表

2020-12-29 08:04:16

可視化地圖組件日歷組件

2018-03-27 22:40:59

深度學習

2019-03-05 09:20:47

Vim可視化模式命令
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.99re| 色秀网站 | 亚洲一一在线 | 欧美激情精品久久久久久变态 | 国产高清免费视频 | 日韩电影在线 | 午夜影院黄| 亚洲国产一区在线 | 日本不卡一区二区三区 | 国产精品久久久久久久免费大片 | 国产欧美精品一区二区色综合朱莉 | 亚洲精品国产一区 | 中文字幕三区 | 一区二区三区在线免费 | 亚洲精品在线免费 | 在线免费观看成人 | 亚洲国产一区二区视频 | 午夜精品福利视频 | 久久国产精品-国产精品 | 午夜免费| 日韩在线欧美 | 亚洲人a | 国产精品久久一区 | 在线观看免费av网 | 欧美日韩在线精品 | 日韩波多野结衣 | 亚洲一区二区在线视频 | 99热视 | 亚洲欧美国产一区二区三区 | 久久久久久久久久毛片 | 欧美大片一区 | 四虎永久免费黄色影片 | 成人精品一区二区三区中文字幕 | 99久久精品国产一区二区三区 | 日韩毛片免费看 | 二区中文字幕 | 特级特黄特色的免费大片 | 精品欧美一区二区三区免费观看 | 久久草在线视频 | 亚洲久草 | 亚洲交性 |