理解d3.js中的UpdateEnterExit

Posted 但沉默。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解d3.js中的UpdateEnterExit相关的知识,希望对你有一定的参考价值。

什么是 Update、Enter、Exit?

svg.selectAll("rect")   //选择svg内所有的矩形
    .data(dataset)      //绑定数组
    .enter()            //指定选择集的enter部分
    .append("rect")     //添加足够数量的矩形元素

这段代码使用的情况是当以下情况出现的时候:

假设,在 body 中有三个 p 元素,有一数组 [3, 6, 9],则可以将数组中的每一项分别与一个 p 元素绑定在一起。但是,有一个问题:当数组的长度与元素数量不一致(数组长度 > 元素数量 or 数组长度 < 元素数量)时呢?这时候就需要理解 Update、Enter、Exit 的概念。

如果数组为 [3, 6, 9, 12, 15],将此数组绑定到三个 p 元素的选择集上。可以想象,会有两个数据没有元素与之对应,这时候 D3 会建立两个空的元素与数据对应,这一部分就称为 Enter。而有元素与数据对应的部分称为 Update。如果数组为 [3],则会有两个元素没有数据绑定,那么没有数据绑定的部分被称为 Exit。示意图如下所示。

通过这个图片可以很清楚的知道

svg.selectAll("rect")   //选择svg内所有的矩形
    .data(dataset)      //绑定数组
    .enter()            //指定选择集的enter部分
    .append("rect")     //添加足够数量的矩形元素

这段代码的意思了, 此时svg里没有rect元素,即元素数量为0,有一数组dataset,将数组与元素数量为0的选择集绑定后,选择其enter部分,然后添加(append)元素,也就是添加足够的元素,使得每一个数据都有元素与之对应

Update 和 Enter 的使用

当对应的元素不足时 ( 绑定数据数量 > 对应元素 ),需要添加元素(append)。

现在 body 中有三个 p 元素,要绑定一个长度大于 3 的数组到 p 的选择集上,然后分别处理 update 和 enter 两部分。

var dataset = [ 3 , 6 , 9 , 12 , 15 ];

//选择body中的p元素
var p = d3.select("body").selectAll("p");

//获取update部分
var update = p.data(dataset);

//获取enter部分
var enter = update.enter();

//update部分的处理:更新属性值
update.text(function(d){
    return "update " + d;
});

//enter部分的处理:添加元素后赋予属性值
enter.append("p")
    .text(function(d){
        return "enter " + d;
    });

结果如下:

update 3

update 6

update 9

enter 12

enter 15

所以:

update部分的处理办法一般是更新属性值

enter部分的处理办法一般是添加元素后,赋予属性值

Update 和 Exit 的使用

当对应的元素过多时 ( 绑定数据数量 < 对应元素 ),需要删掉多余的元素。

现在 body 中有三个 p 元素,要绑定一个长度小于 3 的数组到 p 的选择集上,然后分别处理 update 和 exit 两部分。

var dataset = [ 3 ];

//选择body中的p元素
var p = d3.select("body").selectAll("p");

//获取update部分
var update = p.data(dataset);

//获取exit部分
var exit = update.exit();

//update部分的处理:更新属性值
update.text(function(d){
    return "update " + d;
});

//exit部分的处理:修改p元素的属性
exit.text(function(d){
        return "exit";
    });

//exit部分的处理通常是删除元素
// exit.remove();

这里为了表明哪一部分是 exit,并没有删除掉多余的元素,但实际上 exit 部分的绝大部分操作是删除。

结果如下:

update 3

exit

exit

以上是关于理解d3.js中的UpdateEnterExit的主要内容,如果未能解决你的问题,请参考以下文章

D3.js使用过程中的常见问题(D3版本D3V4)

D3.js Sankey Diagrams中的链接可以是除了立方贝塞尔曲线之外的任何东西吗?

D3.js的v5版本入门教程(第七章)—— 比例尺的使用

D3.js 入门系列 --- 7 理解 update, enter, exit 的使用

D3.js的v5版本入门教程(第十三章)—— 饼状图

Javascript / D3.js - 绘制大型数据集 - 提高 d3.js 绘制的 svg 图表中的缩放和平移速度