d3.js学习笔记--Mike Bostock: Thinking with Joins

    我们可以使用append方法, 来创建一个单一元素:

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

    如果想传递多条数据, 则需要这样编写:

  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元素呢?

以下是处理方式. 我们不必告诉D3如何实现, 而是告诉D3我们所想要的. 我想要一个circle绑定到一个data上, 即每个circle和data数组中的元素一一对应. 这种概念叫做: data join

202517_6iz0_1017135.png

数据 join to 存在的DOM元素, 产生一个update操作. 坐标非update的数据产生enter的操作, 而右边的DOM元素由于没有绑定, 则处于Exit状态, 代表被删除.

现在我们来解释以下神奇的enter-append 的代码是如何data join:

1. 首先, svg.selectAll("circle")返回一个空的选择器, 它的父节点是svg.

2. 空的选择器绑定于数据data, 产生三个新的选择器分别代表Eneter, update 和 exit. 这三个选择器都是空的, 只有Enter为每个新的元素保留占位符.

3. selection.data返回update选择器, 当enter/exit均解绑于update的时候. selection.enter返回enter选择器.

4. 

 

 

 

 

 

 

 

转载于:https://my.oschina.net/voler/blog/775063

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值