中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

d3.js如何實現數據綁定

發布時間:2021-08-18 14:58:43 來源:億速云 閱讀:275 作者:小新 欄目:web開發

這篇文章主要介紹了d3.js如何實現數據綁定,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

前言

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

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

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

是的,只有一個 append 方法,用于產生單個DOM元素:

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

但那只是單個圓,而你想要更多: 最好data*中每個元素對應一個圓. 在你用蠻力寫循環把圓畫出來之前,讓我們看看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 數組,其每個元素 由 x 和 y屬性構成, 例如: [{"x": 1.0, "y":1.1},{"x": 2.0, "y":2.5}, …]. 另,SVG circle元素用cx,cy表達圓心坐標,r表達半徑長度.

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

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

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

data-join的背后執行了以下步驟:

  • selectAll("circle") 返回了一個空的選擇

  • 空的選擇通過 data()方法將數據和DOM元素綁定,并產生三個虛擬的子集: enter, update and exit. enter()方法包含了待添加的數據及相應的DOM元素的占位符;update()包含了已與數據綁定的現有元素.剩下待移除的部分被包含在 exit ()方法中

  • 一開始選擇的結果是空的,因此所有數據都是待添加,將全部出現在enter的結果中.

  • 無需循環,通過.enter().append("circle")將待添加的元素一次性加入到SVG容器.

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

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

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. 如果新的數據集比原來的少,多余元素會出現在 exit 中并被remove()刪除.反之亦然,新增的數據出現在enter()中通過append()添加DOM元素.若新老數據集大小不變,則所有數據只是更新坐標.(譯注:上文中介于enter和exit之間的代碼,update()會被隱式調用)

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

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

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

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

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“d3.js如何實現數據綁定”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淮南市| 深州市| 东宁县| 松阳县| 乐安县| 当涂县| 汶川县| 清流县| 清徐县| 巩留县| 乐平市| 喀什市| 湖口县| 英山县| 嘉义市| 广德县| 正宁县| 新巴尔虎左旗| 永顺县| 资讯| 浠水县| 辰溪县| 云南省| 深水埗区| 原平市| 武城县| 靖安县| 潜山县| 虹口区| 彩票| 阿克苏市| 石嘴山市| 曲靖市| 蚌埠市| 新竹市| 潞西市| 太和县| 乐东| 龙泉市| 天水市| 塘沽区|