d3.js學習筆記--Mike Bostock: Thinking with Joins

    咱們能夠使用append方法, 來建立一個單一元素:javascript

var svg = d3.select('svg'),
      d = {"x": 50, "y": 50};
  svg.append("circle")
      .attr("cx", d.x)
      .attr("cy", d.y)
      .attr("r", 25);

    若是想傳遞多條數據, 則須要這樣編寫:java

var svg = d3.select('svg'),
      data = [{"x": 50, "y": 50}, {"x": 120, "y": 50}];
  svg.selectAll("circle")
      .data(data)
      .enter()
      .append("circle")
      .attr("cx", function(d) { return d.x; })
      .attr("cy", function(d) { return d.y; })
      .attr("r", 25);

這裏代碼主要的疑惑點在於: 數組

svg.selectAll("circle")

爲何咱們要選擇要新建立的DOM元素呢?app

如下是處理方式. 咱們沒必要告訴D3如何實現, 而是告訴D3咱們所想要的. 我想要一個circle綁定到一個data上, 即每一個circle和data數組中的元素一一對應. 這種概念叫作: data joinsvg

數據 join to 存在的DOM元素, 產生一個update操做. 座標非update的數據產生enter的操做, 而右邊的DOM元素因爲沒有綁定, 則處於Exit狀態, 表明被刪除.code

如今咱們來解釋如下神奇的enter-append 的代碼是如何data join:ip

1. 首先, svg.selectAll("circle")返回一個空的選擇器, 它的父節點是svg.ci

2. 空的選擇器綁定於數據data, 產生三個新的選擇器分別表明Eneter, update 和 exit. 這三個選擇器都是空的, 只有Enter爲每一個新的元素保留佔位符.it

3. selection.data返回update選擇器, 當enter/exit均解綁於update的時候. selection.enter返回enter選擇器.io

4. 

相關文章
相關標籤/搜索