成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

組件化可視化圖表 - Recharts

roland_reed / 2076人閱讀

摘要:是年初團(tuán)隊(duì)可視化組推出的一款可視化組件庫,為基礎(chǔ)表格的繪制提供了另外一種可能。為方便國(guó)際化,文檔只有英文官網(wǎng),中文官網(wǎng)還在編寫中。如果試用有問題,歡迎給項(xiàng)目提請(qǐng)使用英文來提,謝謝。

Recharts 是 2016 年初團(tuán)隊(duì)可視化組推出的一款可視化組件庫,為基礎(chǔ)表格的繪制提供了另外一種可能。

Recharts 含義是重新定義(Redefined)圖表。這個(gè)名字的背后在于這個(gè)圖表在設(shè)計(jì)上帶給開發(fā)者的是不一樣的體驗(yàn),不僅是用 React 設(shè)計(jì),也在于重新定義了組合與配置方式。

Recharts 到今天的版本是 0.9.3,支持 React 0.14.x 或 15.0.x 版本,現(xiàn)在有至少四個(gè)國(guó)外團(tuán)隊(duì)在產(chǎn)品中使用。為方便國(guó)際化,文檔只有英文官網(wǎng) Recharts,中文官網(wǎng)還在編寫中。如果試用有問題,歡迎給項(xiàng)目提 issue(P.S. 請(qǐng)使用英文來提,謝謝)。

接下來我們會(huì)從思想層面來剖析 Recharts 的原理和精髓。

大家可以回顧一下在做圖表類的需求時(shí),碰到最糾結(jié)的問題是什么?這里列了一些我碰到最多的問題:

配置非常復(fù)雜,可配置的內(nèi)容太多,找不到到底使用什么配置項(xiàng)來達(dá)到想要的目的

很多樣式無法完全統(tǒng)一,變化很多。這個(gè)線圖怎么多了條線?這個(gè)柱圖的“柱子”怎么是個(gè)三角形?

那 Recharts 是怎么解決這些問題呢?

聲明式的標(biāo)簽,讓寫圖表和寫 HTML 一樣簡(jiǎn)單

貼近原生 SVG 的配置項(xiàng),讓配置項(xiàng)更加自然

接口式的 API,解決各種個(gè)性化的需求

下面我們將仔細(xì)分析這些是怎么實(shí)現(xiàn)的。

聲明式的標(biāo)簽

在看代碼實(shí)現(xiàn)之前,我們先看看怎樣一步步的根據(jù)各自的需求創(chuàng)建一個(gè)線圖:

首先,通過調(diào)用 LineChart 添加一條 dataKeypvLine

const data = [{ name: "a", uv: 4000, pv: 2400 }, { name: "b", uv: 3000, pv: 1398 }, ....];


  

運(yùn)行代碼后結(jié)果如下:

然后,我們可以根據(jù)自己的需求去豐富這個(gè)線圖,比如這個(gè)線圖需要一個(gè) X 軸和 Y 軸,那只需要在 LineChart 下添加一個(gè) XAxisYAxis 標(biāo)簽即可:

const data = [{ name: "a", uv: 4000, pv: 2400 }, { name: "b", uv: 3000, pv: 1398 }, ....];


  
  
  

運(yùn)行代碼結(jié)果如下:

大家看到用 Recharts 繪制圖表很多時(shí)候就想拼積木一樣,那 LineChart 內(nèi)部是如何去識(shí)別這些『零件』的呢?我們先來看一個(gè)簡(jiǎn)單的函數(shù):

const getDisplayName = (Comp) => {
  if (!Comp) { return ""; }
  if (typeof Comp === "string") { return Comp; }
  return Comp.displayName || Comp.name || "Component";
};

這個(gè)方法很簡(jiǎn)單,可以用來讀取某個(gè) ReactComponent 的名稱。在 LineChart 的代碼實(shí)現(xiàn)中,就是根據(jù) ReactComponent 的 displayName 來識(shí)別所有的 Children。我們先來看一個(gè)工具方法:

const findAllByType = (children, type) => {
  const result = [];
  let types = [];

  if (_.isArray(type)) {
    types = type.map(t => getDisplayName(t));
  } else {
    types = [getDisplayName(type)];
  }

  React.Children.forEach(children, child => {
    const childType = child && child.type && (child.type.displayName || child.type.name);
    if (types.indexOf(childType) !== -1) {
      result.push(child);
    }
  });

  return result;
};

這里 type 可以是 ReactComponent 或者 ReactComponent 數(shù)組。而 LineChart 內(nèi)部實(shí)現(xiàn)的時(shí)候就是調(diào)用這個(gè)方法來識(shí)別各個(gè)『零件』:

    ...
    render() {
        const { children } = this.props;
        const lineItems = findAllByType(children, Line);
        ...
    }
貼近原生的配置項(xiàng)

圖表的配置項(xiàng)可以非常多,但是有很多配置項(xiàng)如填充顏色、描邊顏色、描邊寬度等等這些都是SVG標(biāo)簽原生就支持的屬性,為了減小大家的配置的成本,Recharts 的組件會(huì)去解析原生的屬性。舉個(gè)例子,一個(gè)線圖里面有兩條曲線,我想給一條曲線設(shè)置成虛線,一條設(shè)置成實(shí)線,我們只需要像原生的 SVG 元素一樣設(shè)置 stroke-dasharray 屬性就行:

const data = [{ name: "a", uv: 4000, pv: 2400 }, { name: "b", uv: 3000, pv: 1398 }, ....];


  
  
  
  

結(jié)果如下:

實(shí)現(xiàn)原理也比較簡(jiǎn)單,首先 Recharts 內(nèi)部維護(hù)一份 SVG 元素支持的所有屬性,然后在渲染 SVG 元素之前,我們會(huì)去解析相應(yīng)的ReactElement的 props,看看哪些是 SVG 元素能夠支持的屬性,最終這些屬性可以傳入到渲染的 SVG 元素中。

const PRESENTATION_ATTRIBUTES = {
    fill: PropTypes.string,
    strokeDasharray: PropTypes.string,
    ...
};
const getPresentationAttributes = (el) => {
  if (!el || _.isFunction(el)) { return null; }

  const props = React.isValidElement(el) ? el.props : el;
  let result = null;

  for (const key in props) {
    if (props.hasOwnProperty(key) && PRESENTATION_ATTRIBUTES[key]) {
      if (!result) {result = {};}
      result[key] = props[key];
    }
  }

  return result;
};

關(guān)于更多SVG屬性,大家可以參考W3C標(biāo)準(zhǔn)文檔

接口式的 API

很多時(shí)基礎(chǔ)圖表往往不能滿足所有的要求,那怎么去滿足各種個(gè)性化的需求成了圖表組件必須要考慮的事情。

Recharts 對(duì)可能會(huì)變化的元素都提供了自定義的接口,以x軸的刻度為例,普通的刻度就是一些文字,在信息圖表中,為了讓圖表更佳的生動(dòng),視覺往往希望能夠?qū)⑽淖痔鎿Q成形象的 icon。

對(duì)于這種自定義的需求,Recharts 提供了兩種方式,第一種是通過 React Element 的方式:

const CustomizedTick = (props) => {
  const { x, y, payload, bgColor, index } = props;

  return (
      
          
      {index}
    
  );
};


  }/>
  
  
  

通過將 tick 設(shè)置成一個(gè) React Element,在拿到內(nèi)部 props 的同時(shí),也可以非常方便的從外部傳入 props

第二種自定義的方式是通過 function:

const renderCustomizedTick = (props) => {
  const { x, y, payload, index } = props;

  return (
      
          
      {index}
    
  );
};


  
  
  
  

這種方法,renderCustomizedTick 中拿到的參數(shù)和 CustomizedTickprops 是一樣的,當(dāng)然這種自定義的方法外部傳參數(shù)會(huì)稍微麻煩一些。

看到這里大家可能會(huì)好奇內(nèi)部是怎么去實(shí)現(xiàn)?原理也非常簡(jiǎn)單,我們?cè)趦?nèi)部計(jì)算好 tick 的位置等信息,然后判讀 tick 參數(shù)的類型,實(shí)現(xiàn)代碼簡(jiǎn)化如下:

let tickItem;

if (React.isValidElement(tick)) {
  tickItem = React.cloneElement(tick, props);
} else if (_.isFunction(tick)) {
  tickItem = tick(props);
} else {
  tickItem = {value};
}

看到這里大家可以發(fā)現(xiàn) Recharts 內(nèi)部主要做了計(jì)算各種 layout 的事,每個(gè)區(qū)塊具體展示什么內(nèi)容都是可以自定義的。

延伸

到這里我們已經(jīng)介紹了 Recharts 實(shí)現(xiàn)可視化組件的一些核心思想,其實(shí)這些思想不只是在可視化組件中可以應(yīng)用,很多組件也可以考慮利用這種思想來實(shí)現(xiàn),例如表格組件就可以抽取 TableColumn 兩個(gè)組件,然后大家使用表格也非常簡(jiǎn)單:


  }/>
  
關(guān)于 1.0 版本的發(fā)布

我們大約會(huì)在本月末,或下月初發(fā)布,

更好的動(dòng)畫支持

同步文檔更新

增加一些圖表的支持

90% 的測(cè)試覆蓋率

關(guān)于無線支持可能會(huì)放到 1.0 之后再考慮,因?yàn)?SVG 對(duì)手機(jī)的兼容性支持度一般。1.0 版本之后,會(huì)切分出 React 15.x 的 Recharts。因?yàn)?15.x 對(duì) SVG 的支持更加完善。

盡管 web 端已經(jīng)有不少優(yōu)秀的可視化庫,亦或是圖表庫,比如 Echarts,highcharts,科學(xué)界有 ggplot,他們都是可視化界的前輩。在可視化的探索上,給我們很多啟發(fā)。我們?cè)?Recharts 的初忠是給 React 社區(qū)貢獻(xiàn)一個(gè)代碼更優(yōu)雅,靈活可裝卸的圖表庫的圖表庫。

感謝團(tuán)隊(duì)可視化組的小伙伴。最后是安利時(shí)間,第一款使用 Recharts 的線上項(xiàng)目 阿里指數(shù)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/79250.html

相關(guān)文章

  • 前端開發(fā)者常用的9個(gè)JavaScript圖表

    摘要:使用來呈現(xiàn)圖表。允許用戶在應(yīng)用程序中創(chuàng)建美觀的可復(fù)用的圖表。它是基于創(chuàng)建的,是一個(gè)以數(shù)據(jù)為中心的圖表庫,可以改進(jìn)數(shù)據(jù)可視化的效果。非常輕巧,并使用元素來創(chuàng)建很奇特的圖表。是庫中較為古老的圖表庫之一??偨Y(jié)以上介紹的庫都是高質(zhì)量的圖表庫。 當(dāng)前,數(shù)據(jù)可視化已經(jīng)成為數(shù)據(jù)科學(xué)領(lǐng)域非常重要的一部分。不同網(wǎng)絡(luò)系統(tǒng)中產(chǎn)生的數(shù)據(jù),都需要經(jīng)過適當(dāng)?shù)目梢暬幚?,以便更好的呈現(xiàn)給用戶讀取和分析。 對(duì)任何一個(gè)...

    luck 評(píng)論0 收藏0
  • 14個(gè)最好的 JavaScript 數(shù)據(jù)視化

    摘要:適用于,演示這是開發(fā)的一個(gè)簡(jiǎn)單的可視化庫,它允許你創(chuàng)建所有常用的圖表類型條形圖,樹形圖,折線圖,面積圖等??梢暂p松地對(duì)折線圖和條形圖進(jìn)行混合和匹配以組合不同的數(shù)據(jù)集,這是非常棒的功能。 翻譯:瘋狂的技術(shù)宅原文:https://www.monterail.com/blo... 本文首發(fā)微信公眾號(hào):jingchengyideng歡迎關(guān)注,每天都給你推送新鮮的前端技術(shù)文章 你的程序有多...

    Mertens 評(píng)論0 收藏0
  • 11個(gè)React Native 組件庫和 Javascript 數(shù)據(jù)視化

    摘要:數(shù)據(jù)可視化庫超過的的可能是最流行和最廣泛的數(shù)據(jù)可視化庫。是一組組件,用于高效地渲染大型列表和表格數(shù)據(jù)。一種優(yōu)雅而靈活的方式,可以利用組件來支持實(shí)際的數(shù)據(jù)可視化。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! React Native 組件庫 1. NativeBase showImg(https://segmentfault.com/img/bVbrLHH?w=...

    tangr206 評(píng)論0 收藏0
  • 基于Decorator的組件擴(kuò)展實(shí)踐

    摘要:在業(yè)務(wù)統(tǒng)一的情況下,僅僅修改組件用于配置的就可以滿足業(yè)務(wù)需求。避免了復(fù)雜的圖表配置,而將圖表進(jìn)行有效拆分,通過聲明式的標(biāo)簽進(jìn)行組合,從而使圖表更具擴(kuò)展性。而對(duì)于顆粒度最細(xì)的組件,我們希望它是純粹的,木偶式的組件。 在前端業(yè)務(wù)開發(fā)中,組件化已經(jīng)成為我們的共識(shí)。沉淀和復(fù)用組件,是提高開發(fā)效率的利器。但在組件復(fù)用的過程中,我們往往會(huì)遇到這樣的問題,組件相似,卻在結(jié)構(gòu)或交互上有些許差別,需要對(duì)...

    魏明 評(píng)論0 收藏0
  • GitHub 值得收藏的前端項(xiàng)目[每月更新...]

    摘要:也是一款優(yōu)秀的響應(yīng)式框架站點(diǎn)所使用的一套框架為微信服務(wù)量身設(shè)計(jì)的一套框架一組很小的,響應(yīng)式的組件,你可以在網(wǎng)頁的項(xiàng)目上到處使用一個(gè)可定制的文件,使瀏覽器呈現(xiàn)的所有元素,更一致和符合現(xiàn)代標(biāo)準(zhǔn)。 GitHub 值得收藏的前端項(xiàng)目 整理與收集的一些比較優(yōu)秀github項(xiàng)目,方便自己閱讀,順便分享出來,大家一起學(xué)習(xí),本篇文章會(huì)持續(xù)更新,版權(quán)歸原作者所有。歡迎github star與fork 預(yù)...

    maxmin 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<