D3.js入門之D3?DataJoin的使用
DataJoin(數(shù)據(jù)連接)是D3中很重要的一個(gè)概念。上一章有提到D3是基于數(shù)據(jù)操作DOM的js庫,DataJoin使我們能夠根據(jù)現(xiàn)有 HTML 文檔中的數(shù)據(jù)集注入、修改和刪除元素。
上一章中我們用forEach
循環(huán)的方式,畫了三個(gè)圓,那么在D3中該怎樣優(yōu)雅的處理呢?
const circles = [ { text: 1, color: "red" }, { text: 2, color: "green" }, { text: 3, color: "blue" } ]; svg.selectAll("circle") .data(circles) // 綁定數(shù)據(jù) .enter() // 獲取有數(shù)據(jù)沒dom的集合 .append("circle") .attr("class", "circle") .attr("id", (d) => `circle${d.text}`) // d 表示 data綁定的數(shù)據(jù)中的一項(xiàng) .attr("cx", (d) => 50 * d.text) .attr("cy", 50) .attr("r", 20) .attr("fill", (d) => d.color);
data、enter、exit
- data 將指定數(shù)組的數(shù)據(jù) data 與已經(jīng)選中的元素進(jìn)行綁定并返回一個(gè)新的選擇集和enter 和 exit
- enter 返回選擇集中有數(shù)據(jù)但沒有對(duì)應(yīng)的DOM元素
- exit 選擇集中有DOM元素但沒有對(duì)應(yīng)的數(shù)據(jù)
<div id="dataEnter"> <p></p> <p></p> <p></p> <p></p> <p></p> </div>
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; const update = d3.select("#dataEnter") .selectAll("p") .data(arr) .text((d) => d);
因?yàn)橛?個(gè)p標(biāo)簽,所以從1開始渲染到5。
enter
返回的是有數(shù)據(jù)沒有dom的集合,也就是數(shù)據(jù)比dom多,所以enter
和append
基本上都是成對(duì)出現(xiàn)的。
d3.select("#dataEnter") .selectAll("p") .data(arr) .enter() .append("p") .text((d) => d);
exit
返回的是有dom沒有數(shù)據(jù)的集合,也就是dom比數(shù)據(jù)多,所以exit
和remove
基本上也是成對(duì)出現(xiàn)的。
const arr = [1,2,3] d3.select("#dataEnter") .selectAll("p") .data(arr) .text((d) => d) .exit() .remove();
datum
如果datum()
綁定的值是數(shù)組,那么整個(gè)數(shù)組會(huì)綁定到每個(gè)被選擇的元素上。
而使用data()
的話,那么會(huì)依次綁定數(shù)據(jù)。
const datumDom = d3.select("#datum") .selectAll("p") .datum(circles) .text((d) => { console.log(d); return JSON.stringify(d); });
selection.datum().append()
如果選擇集是空的,那么并不會(huì)添加元素,所以使用datum
要確保選擇項(xiàng)(dom)存在。實(shí)際項(xiàng)目中,圖表都是從0到1繪制,所以一般都是使用data().append()
。
join
const arr = [1, 2, 3]; svg.selectAll("circle") .data(arr) .join("circle") .attr("cx", (d) => d * 50) .attr("cy", (d) => d * 50) .attr("r", 16) .attr("fill", "#F89301");
join 根據(jù)需要追加、刪除和重新排列元素,以匹配先前通過選擇綁定的數(shù)據(jù),返回合并后的enter和update集合。
也就是說join
是一個(gè)簡(jiǎn)化操作,我們可以把join
分解一下:
const circle = svg.selectAll("circle").data(arr); const newCircle = circle.enter() .append("circle") .merge(circle) .attr("cx", (d) => d * 50) .attr("cy", (d) => d * 50) .attr("r", 16) .attr("fill", "#F89301");
最后
這里有一個(gè)示例動(dòng)態(tài)的顯示了enter(綠色)
、update(灰色)
、exit(紅色)
效果:
以上就是D3.js入門之D3 DataJoin的使用的詳細(xì)內(nèi)容,更多關(guān)于D3.js DataJoin的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
js實(shí)現(xiàn)json數(shù)據(jù)行到列的轉(zhuǎn)換的實(shí)例代碼
為了實(shí)現(xiàn)這樣的數(shù)據(jù)顯示出來三個(gè)序列,分別為鄭州、新鄉(xiāng)、安陽的電量,就需要自己實(shí)現(xiàn)對(duì)這樣數(shù)據(jù)的轉(zhuǎn)換,轉(zhuǎn)換成如下的形式:2013-08-08詳解javascript 正則表達(dá)式之分組與前瞻匹配
本文主要講解javascript 的正則表達(dá)式中的分組匹配與前瞻匹配的,需要對(duì)正則的有基本認(rèn)識(shí),本人一直對(duì)兩種匹配模棱不清,還有不清楚的朋友跟隨腳本之家小編一起看看吧2018-05-05xmlplus組件設(shè)計(jì)系列之圖標(biāo)(ICON)(1)
這篇文章主要為大家詳細(xì)介紹了xmlplus組件設(shè)計(jì)系列之圖標(biāo)ICON的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05javascript彈性運(yùn)動(dòng)效果簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了javascript彈性運(yùn)動(dòng)效果簡(jiǎn)單實(shí)現(xiàn)方法,實(shí)例分析了JavaScript實(shí)現(xiàn)彈性運(yùn)動(dòng)的原理,涉及JavaScript數(shù)學(xué)運(yùn)算與時(shí)間函數(shù)的相關(guān)使用技巧,需要的朋友可以參考下2016-01-01JS實(shí)現(xiàn)的駝峰式和連字符式轉(zhuǎn)換功能分析
這篇文章主要介紹了JS實(shí)現(xiàn)的駝峰式和連字符式轉(zhuǎn)換功能,結(jié)合實(shí)例形式分析了JS實(shí)現(xiàn)字符串的駝峰式與連接符式轉(zhuǎn)換的實(shí)現(xiàn)技巧,涉及js字符串遍歷、轉(zhuǎn)換及正則表達(dá)式相關(guān)操作方法,需要的朋友可以參考下2016-12-12JavaScript刪除有序數(shù)組中的重復(fù)項(xiàng)
這篇文章主要介紹了JavaScript刪除有序數(shù)組中的重復(fù)項(xiàng),主要解決有序數(shù)組?nums?,要求原地刪除重復(fù)出現(xiàn)的元素,使每個(gè)元素只出現(xiàn)一次,返回刪除后數(shù)組的新長(zhǎng)的問題,下面實(shí)現(xiàn)操作,需要的小伙伴可以參考一下2022-03-03js實(shí)現(xiàn)滾動(dòng)條自動(dòng)滾動(dòng)到最底部示例代碼
這篇文章主要給大家介紹了關(guān)于js實(shí)現(xiàn)滾動(dòng)條自動(dòng)滾動(dòng)到最底部的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用js具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2023-06-06