D3 的全稱是Data-Driven Documents,即數據驅動文檔,用來作數據可視化。node
insert()
在選擇集前面插入元素數組
append()
在選擇集末尾插入元素app
select()
選擇全部指定元素的第一個svg
selectAll()
選擇指定所有元素函數
datum()
綁定一個數據到選擇集上rest
data()
綁定一個數組到選擇集上,數組的各項值分別與選擇集的各元素綁定code
update()
、enter()
、exit()
是 D3 中三個很是重要的概念,它處理的是當選擇集和數據的數量關係不肯定的狀況。blog
update()
:對應的元素正好知足( 綁定數據數量 = 對應元素),直接操做便可,後面直接跟text()
,style()
等操做。事件
enter()
對應的元素不足( 綁定數據數量 > 對應元素 ),須要添加元素,使之與綁定數據的數量相等。後面一般先跟append()
操做。rem
exit()
對應的元素過多( 綁定數據數量 < 對應元素 ),須要刪除元素,使之與綁定數據的數量相等。後面一般要跟remove()
操做。
const bindData = (root, data, tag) => ( root.append('g') .selectAll(tag) .data(data) .enter() .append(tag) );
上述這段代碼起到了綁定數據的做用,將data
綁定到root
上的全部tag
元素上,當tag
不足時添加tag
使tag
的數量與綁定data
的數量相等。
舉個例子:
export const d3Connections = (svg, connections) => { return bindData(svg, connections, 'path') .attr('class', 'mindmap-connection'); };
將connections
綁定到svg
的path
元素上,使用mindmap-connection
覆蓋原有的class
屬性。這裏svg
是畫布,path
是svg
中的路徑屬性,用來繪製圖形,connections
是鏈接的集合,並將class
綁定爲mindmap-connection
對鏈接進行渲染。
export const d3Drag = (simulation, svg, nodes) => { const dragStart = (node) => { if (!event.active) { simulation.alphaTarget(0.2).restart(); } node.fx = node.x; node.fy = node.y; }; const dragged = (node) => { node.fx = event.x; node.fy = event.y; }; const dragEnd = () => { if (!event.active) { simulation.alphaTarget(0); } }; return drag() .on('start', dragStart) .on('drag', dragged) .on('end', dragEnd); };
simulation
是繪圖的模擬器,svg
是畫布,nodes
是全部的節點,在以後可直接使用(node) => {}
表示對nodes
中每個元素進行操做。
上述代碼表示了拖動節點的三個過程:開始拖動、拖動、結束拖動。
node.x
與node.y
是節點當前的橫縱座標,node.fx
與node.fy
是節點固定的橫縱座標,這兩個屬性可讓節點固定在一個位置,即在其餘節點拖動的時候位置不會改變。每次tick
結束後,節點的 node.x
會被從新設置爲 node.fx
, node.y
會被從新替換爲 node.fy
。這裏on()
用於交互,當監聽到start
事件就調用dragStart
函數,當監聽到drag
事件就調用dragged
函數,當監聽到end
事件就調用dragEnd
函數。