国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

d3.js入門教程之數據綁定詳解

2024-05-06 15:17:53
字體:
來源:轉載
供稿:網友

前言

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();             
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 马尔康县| 枣阳市| 玛沁县| 阿拉善右旗| 鄂托克前旗| 海城市| 襄垣县| 泸水县| 九江县| 库车县| 五莲县| 绥芬河市| 西昌市| 若尔盖县| 唐海县| 襄垣县| 类乌齐县| 祁阳县| 海南省| 白水县| 五莲县| 县级市| 卫辉市| 崇明县| 比如县| 通榆县| 湛江市| 哈巴河县| 新疆| 永城市| 安乡县| 东港市| 海宁市| 桦南县| 仙居县| 洪泽县| 宝兴县| 江阴市| 文成县| 九江县| 孟州市|