欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

d3.js入門教程之數(shù)據(jù)綁定詳解

 更新時間:2017年04月28日 09:57:37   作者:doraeimo  
這篇文章主要介紹了關于d3.js數(shù)據(jù)綁定的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習只d3.js具有一定的參考價值,需要的朋友下面來一起看看吧。

前言

d3.js 是一款上手容易的js類庫,專門用于繪制svg圖形圖表,其關鍵理念為data-join 意即數(shù)據(jù)綁定.搞清這個概念非常重要,它將以簡潔優(yōu)雅的形式體現(xiàn)數(shù)據(jù)驅動編程.

以下是Thinking with Joins的拙譯 ,原作者Mike Bostock

假設你要用D3畫一副散點圖,因此需要生成一些 SVG circle 元素來直觀地展現(xiàn)數(shù)據(jù). 你會驚訝地發(fā)現(xiàn)D3沒有提供原生的產(chǎn)生多個DOM元素的接口,

是的,只有一個 append 方法,用于產(chǎn)生單個DOM元素:

svg.append("circle") 
 .attr("cx", d.x) 
 .attr("cy", d.y) 
 .attr("r", 2.5); 

但那只是單個圓,而你想要更多: 最好data*中每個元素對應一個圓. 在你用蠻力寫循環(huán)把圓畫出來之前,讓我們看看D3中的一個例子:

svg.selectAll("circle") 
 .data(data) 
 .enter().append("circle") 
 .attr("cx", function(d) { return d.x; }) 
 .attr("cy", function(d) { return d.y; }) 
 .attr("r", 2.5); 

*此處 data是一個 JSON 數(shù)組,其每個元素 由 x 和 y屬性構成, 例如: [{"x": 1.0, "y":1.1},{"x": 2.0, "y":2.5}, …]. 另,SVG circle元素用cx,cy表達圓心坐標,r表達半徑長度.

這份代碼符合你的需求,即每個元素產(chǎn)生一個圓 , 通過x和y屬性表達圓心的坐標.

selectAll("circle")是什么意思,為什么要在產(chǎn)生所有圓之前去選中根本不存在的元素呢?

原來事情是這樣的:告訴D3你的目標,而不要告訴它具體怎么做. 在這個例子中,D3知道我們的意圖是,要讓選中的"circle"元素來響應數(shù)據(jù)的變化, selectAll即描述了這個目標;而無需一步步指揮D3產(chǎn)生多個圓.這個概念即data-join.

data-join的背后執(zhí)行了以下步驟:

  • selectAll("circle") 返回了一個空的選擇
  • 空的選擇通過 data()方法將數(shù)據(jù)和DOM元素綁定,并產(chǎn)生三個虛擬的子集: enter, update and exit. enter()方法包含了待添加的數(shù)據(jù)及相應的DOM元素的占位符;update()包含了已與數(shù)據(jù)綁定的現(xiàn)有元素.剩下待移除的部分被包含在 exit ()方法中
  • 一開始選擇的結果是空的,因此所有數(shù)據(jù)都是待添加,將全部出現(xiàn)在enter的結果中.
  • 無需循環(huán),通過.enter().append("circle")將待添加的元素一次性加入到SVG容器.

為什么要這么麻煩呢? 為什么不直接提供原生接口? data-join的優(yōu)雅之處在于抽象和解耦.上述代碼在enter()里只是專心處理新增的元素,而update and exit分別專注于處理更新和待刪除部分.這意味著你不用把所有DOM元素刪了重繪,因此得以輕松應對實時變化的數(shù)據(jù),甚至支持一些交互(如拖動)與漸變的效果!

這里是一個處理三種狀態(tài)(增改刪)的例子:

var circle = svg.selectAll("circle") 
 .data(data); 
 
circle.enter().append("circle") 
 .attr("r", 2.5); 
 
circle 
 .attr("cx", function(d) { return d.x; }) 
 .attr("cy", function(d) { return d.y; }); 
 
circle.exit().remove(); 

如果我們重復運行代碼,它會每次重新計算 data-join. 如果新的數(shù)據(jù)集比原來的少,多余元素會出現(xiàn)在 exit 中并被remove()刪除.反之亦然,新增的數(shù)據(jù)出現(xiàn)在enter()中通過append()添加DOM元素.若新老數(shù)據(jù)集大小不變,則所有數(shù)據(jù)只是更新坐標.(譯注:上文中介于enter和exit之間的代碼,update()會被隱式調(diào)用)

以joins的方式思考同時讓你的代碼更直觀: 處理這三種狀態(tài)的代碼無需條件(if)和循環(huán)(for)分支,只需簡單描述讓圖形去響應數(shù)據(jù)的變化即可.如果給定的enter, update 或 exit 的選擇結果為空,則會自動跳過相應的代碼塊,以降低性能開銷.

Joins 支持在特定狀態(tài)(增/刪/改)下執(zhí)行操作.例如,可以在enter而非update代碼塊中,指定靜態(tài)的attributes(例如圓的半徑,用 "r" attribute指定) . 仰賴于精確改動目標元素和最小化DOM變更,你已經(jīng)極大地提升了瀏覽器渲染的表現(xiàn)! 類似地,你可以在特定狀態(tài)下表現(xiàn)漸變等動畫效果. 例如新增的圓可以從無到有漸變(半徑從0到2.5):

circle.enter().append("circle") 
 .attr("r", 0) 
 .transition() 
 .attr("r", 2.5); 

待刪除的圓也可以逐漸收縮直至消失:

circle.exit().transition() 
 .attr("r", 0) 
 .remove(); 

相信現(xiàn)在你已經(jīng)學會用joins的方式思考了!

總結

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

  • 原生js實現(xiàn)商品篩選功能

    原生js實現(xiàn)商品篩選功能

    這篇文章主要為大家詳細介紹了原生js實現(xiàn)商品篩選,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 一篇文章搞定JavaScript類型轉換(面試常見)

    一篇文章搞定JavaScript類型轉換(面試常見)

    這篇文章主要介紹了一篇文章搞定JavaScript類型轉換(面試常見),非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-01-01
  • 詳解cesium實現(xiàn)大批量POI點位聚合渲染優(yōu)化方案

    詳解cesium實現(xiàn)大批量POI點位聚合渲染優(yōu)化方案

    這篇文章主要為大家介紹了cesium實現(xiàn)大批量POI點位聚合渲染優(yōu)化方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • echarts實現(xiàn)雷達圖的詳細步驟

    echarts實現(xiàn)雷達圖的詳細步驟

    這篇文章主要給大家介紹了關于echarts實現(xiàn)雷達圖的詳細步驟,雷達圖(Radar?Chart)是一種信息豐富的可視化工具,其中多個變量(三個或更多)在二維平面上進行比較,文中給出了完整的代碼示例,需要的朋友可以參考下
    2024-01-01
  • 跟我學習javascript的執(zhí)行上下文

    跟我學習javascript的執(zhí)行上下文

    跟我學習javascript的執(zhí)行上下文,讀完本文后,你應該清楚了解釋器做了什么,為什么函數(shù)和變量能在聲明前使用以及它們的值是如何決定的,需要了解這些內(nèi)容的朋友可以參考下
    2015-11-11
  • Webpack框架核心概念(知識點整理)

    Webpack框架核心概念(知識點整理)

    webpack 是一個現(xiàn)代 JavaScript 應用程序的模塊打包器(module bundler)。這篇文章主要介紹了Webpack框架核心概念(知識點整理),需要的朋友可以參考下
    2017-12-12
  • BootStrap整體框架之基礎布局組件

    BootStrap整體框架之基礎布局組件

    這篇文章主要為大家詳細介紹了BootStrap整體框架之基礎布局組件的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • 在layui中對table中的數(shù)據(jù)進行判斷(0、1)轉換為提示信息的方法

    在layui中對table中的數(shù)據(jù)進行判斷(0、1)轉換為提示信息的方法

    今天小編就為大家分享一篇在layui中對table中的數(shù)據(jù)進行判斷(0、1)轉換為提示信息的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JavaScript?中的單例內(nèi)置對象Global?與?Math

    JavaScript?中的單例內(nèi)置對象Global?與?Math

    這篇文章主要介紹了JavaScript?中的單例內(nèi)置對象Global與Math,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-07-07
  • JavaScript運動框架 多物體任意值運動(三)

    JavaScript運動框架 多物體任意值運動(三)

    這篇文章主要為大家詳細介紹了JavaScript運動框架的第三部分,多物體任意值運動,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05

最新評論