合并选择

D3 版本 3 中的更新模式

正确理解输入更新退出选择如何工作对于使用 D3 正确更改 dataviz 至关重要。

从 D3 版本 3 开始(实际上,从版本 2 开始),此代码段可以设置输入更新选项的转换( 此处为现场演示 ):

var divs = body.selectAll("div")
    .data(data);//binding the data

divs.enter()//enter selection
    .append("div")
    .style("width", "0px");

divs.transition()
    .duration(1000)
    .style("width", function(d) { return d + "px"; })
    .attr("class", "divchart")
    .text(function(d) { return d; });

过渡后给出这个结果:

https://i.stack.imgur.com/fTIHv.jpg

但是,如果我们使用 D3 版本 4,完全相同的代码会发生什么?你可以在这个现场演示中看到它 : 没有

为什么?

D3 版本 4 中更新模式的更改

我们来看看代码。首先,我们有 divs。此选择将数据绑定到 <div>

var divs = body.selectAll("div")
    .data(data); 

然后,我们有 divs.enter(),这是一个包含所有具有不匹配元素的数据的选择。这个选择包含我们第一次调用函数 draw 时的所有 div,我们将它们的宽度设置为零。

divs.enter()
    .append("div")
    .style("width", "0px");

然后我们有 divs.transition(),这里我们有一些有趣的行为:在 D3 版本 3 中,divs.transition() 使得 enter 选项中的所有 <div> 都变为它们的最终宽度。但这没有任何意义! divs 不包含 enter 选项,不应修改任何 DOM 元素。

有一个原因,为什么这个奇怪的行为已经在 D3 版本 2 和 3 中引入( 源于此处 ),并且它在 D3 版本 4 中被纠正。因此,在上面的现场演示中,没有任何反应,这是预期的! 此外,如果单击该按钮,则会显示前六个条形图,因为它们现在处于更新选项中,而不再出现在输入选项中。

对于通过输入选择进行的转换,我们必须创建单独的变量,或者更简单的方法,合并选择

divs.enter()//enter selection
    .append("div")
    .style("width", "0px")
    .merge(divs)//from now on, enter + update selections
    .transition().duration(1000).style("width", function(d) { return d + "px"; })
    .attr("class", "divchart")
    .text(function(d) { return d; });

现在,我们合并了输入更新选项。了解它在现场演示中的工作原理。