上一节给大家讲述额绑定数据的原理。当数组的长度与元素的数量不一致时,有enter部分和exit部分,前者表示存在多余的数据,后者表示存在多余的元素。本节将给大家介绍如何处理这些多余的东西,最后会给大家讲解一个处理模板,此模板包含处理enter、exit、update部分的内容。
enter的处理方法 :
如果没有足够的元素,那么处理方法就是添加元素。请看代码 :
 render() {
         return (
             <div id="body" >
                 <p></p>
             </div>
         );
     }
 var dataList = [3,6,9]
         // 选择id为body的容器内的所有的p元素,将选择集结果赋值给变量p
         var p = d3.select("#body")
                 .selectAll("p")

         //绑定数据后,分别获取update和enter部分。
         var update = p.data(dataList);
         var enter = update.enter();

         //update部分的处理方法是直接修改内容
         update.text(function(d){
             return d
         })

         //enter部分的处理方法是添加元素后再修改内容
         enter.append("p")
             .text(function(d){
                 return d
             })
这个例子中,id为body的div中的p元素只有一个,但是dataList中的数据有三个。因此,enter部分有多余的两个数据。
对于多余数据的处理方法就是添加元素(append),使其与多余数据对应。处理之后,d为body的div中有三个p元素。内容分别为
<p>3</p>
<p>6</p>
<p>9</p>
 
但是在我们开发过程中,从后端服务器读取数据后,网页中是没有与之对应的元素的。因此,有一个很常见的用法 :
选择一个空集,然后使用enter().append()的形式来添加足够的数量的元素。例如,假设id为body的div里没有P元素,请看代码 :
 
  render() {
         return (
             <div id="body" >

             </div>
         );
     }
  var dataList = [100,200,300,400,500]; //定义数组数据
         var body = d3.select("#body") //选择id为body的容器赋值给变量body
             body.selectAll("p")  //选择body中所有的p元素,但是没有p,因此说是我们选择了一个空集
                 .data(dataList)  //绑定dataList数组
                 .enter()    //返回enter部分
                 .append("p")    //添加p元素
                 .text(function(d){
                     return d
                 })
上述代码中,selectAll选择了一个空集,然后绑定数据。由于选择集为空,因此data()返回的update部分为空。然后调用enter()返回的enter部分,enter部分包含多余的五个数据。接下来向enter部分添加元素(append),使得每一个数据都有元素p与之对应。最后,更改p元素的内容。需要的时候,可以继续更改样式等。最终,网页中的元素结构为 :
<p>100</p>
<p>200</p>
<p>300</p>
<p>400</p>
<p>500</p>
 
exit的处理方法 :
如果存在多余的元素,没有数据与之对应,那么就需要删除元素。使用remove()即可删除元素。请看下面示例。
假设id为body的div中的有5个p元素。
 
  render() {
         return (
             <div id="body" >
                 <p></p>
                 <p></p>
                 <p></p>
                 <p></p>
                 <p></p>
             </div>
         );
     }
 var dataList = [100,200,300];
         var p = d3.select("#body")
                 .selectAll("p")

         //绑定数据后,分别获取update部分和exit部分
         var update = p.data(dataList);
         var exit = update.exit();

         //update部分的处理方法是修改内容
         update.text(function(d){
             return d
         })

         //exit部分的处理方法是删除
         exit.remove()
这段代码中,对于exit部分的处理方法是删除。删除之后,网页中将不会有多余的p元素,剩下来的每一个p元素都有数据与之对应。最终,网页中的元素结构为 :
<p>100</p>
<p>200</p>
<p>300</p>
处理模板 :
经过学习enter和exit的处理方法,我们知道了如何处理多余的数据和元素。但是,有时候我们在开发过程中不知道是数据多还是元素多,该怎么办? 其实,我们大可不必在意数组长度和元素数量。大多数情况下,update部分都是"更新元素属性"。enter部分都是"添加元素并赋予初始属性",exit部分都是"删除元素"。因此,无论数据和元素如何。其处理方法都是类似的。
因此,我们可归纳成一个处理模板,我们在开发过程中就不必理会数组长度和元素数量之间的关系。模板代码 :
  var dataList = [100,200.300];
         var p = d3.select("#body")
                 .selectAll("p")

         //绑定数据后,分别返回update、enter、exit部分
         var update = p.data(dataList);
         var enter = update.enter();
         var exit = update.exit();

         //update部分的处理方法
         update.text(function(d){
             return d
         })

         // enter部分的处理方法
         enter.append("p")
             .text(function(d){
                 return d
             })

         // exit部分的处理方法
         exit.remove()
如此,则不需要考虑网页中P元素是多以还是不足。无论是哪种情况,最终的结果必定是一个P元素对应数组中一个项,没有多余的。上面的模式,就是为模板。在数据需要经常更新时很常用。
 
 

D3.js的基础部分之选择集的处理 enter和exit的处理方法 (v3版本)的更多相关文章

  1. D3.js的基础部分之选择集的处理 过滤器、选择集的顺序、each()和call()的应用(v3版本)

    选择集的处理 : 过滤器 有时候需要根据绑定数据对某选择集的元素进行过滤,例如某公司,只对id大于100的员工进行奖励.某学校只选拔身高超过170cm的学生等.类似这样的问题,需要根据条件获取选择集的 ...

  2. 【 D3.js 选择集与数据详解 — 4 】 enter和exit的处理方法以及处理模板

    绑定数据之后,选择集分为三部分:update.enter.exit.这三部分的处理办法是什么呢?本文将讲解其处理方法,以及一个常用的处理模板. 1. enter的处理方法 如果没有足够的元素,那么处理 ...

  3. D3.js系列——初步使用、选择元素与绑定数据

    D3 的全称是(Data-Driven Documents),顾名思义可以知道是一个被数据驱动的文档.听名字有点抽象,说简单一点,其实就是一个 JavaScript 的函数库,使用它主要是用来做数据可 ...

  4. d3代码如何改造成update结构(恰当处理enter和exit)

    d3的enter和exit 网上有很多blog讲解.说的还凑合的见:https://blog.csdn.net/nicolecc/article/details/50786661 如何把自己的rude ...

  5. 【 D3.js 入门系列 --- 9.4 】 集群图的制作

    本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 集群图( Cluster )通经常使用于表示包括与被包括关系. ...

  6. D3.js的基础部分之数组的处理 数组的排序和求值(v3版本)

    操作数组   D3提供了将数组洗牌.合并等操作,使用起来是很方便的.   d3.shuffle(array,[,lo[,ji]]) : //随机排列数组. d3.merge(arrays) :   / ...

  7. D3.js的基础部分之数组的处理 映射(v3版本)

    映射(Map)   映射(Map)是十分常见的一种数据结构,由一系列键(key)和值(value)组成的.每个key对应一个value,根据key可以获取和设定value,也可以根据key来查询val ...

  8. D3.js的基础部分之数组的处理 集合(Set)(v3版本)

    数组的处理 之 集合(set) 集合(Set)是数学中常用的概念,表示具有某种特定性质的事物的总体.集合里的项叫做元素.集合的相关方法有:   d3.set([array]) //使用数组来构建集合, ...

  9. D3.js画思维导图(转)

    思维导图的节点具有层级关系和隶属关系,很像枝叶从树干伸展开来的形状.在前面讲解布局的时候,提到有五个布局是由层级布局扩展来的,其中的树状图(tree layout)和集群图(cluster layou ...

随机推荐

  1. AOP 环绕通知 (Schema-base方式) 和 AspectJ方式在通知中获取切点的参数

    环绕通知(Schema- base方式) 1.把前置通知和后置通知都写到一个通知中,组成了环绕通知 2.实现步骤: 2.1 新建一个类实现 MethodInterceptor 接口 public cl ...

  2. 关于oracle的锁表解决session marked for kill

    oracle 使用的过程中,有时候会遇到锁表的情况,数据库增.删.改.查都是会锁表的,但是锁的类型会不同, 大多是行锁,部分会是表锁. 在oracle运行中,一直是有表在锁的,只不过很快一个操作结束, ...

  3. PHP中=>是什么意思

    一般用在php数组键名与元素的连接符如:$arr = array('a'=>'123','b'=>'456'); foreach($arr as $key=>$val){//$key ...

  4. Linux下移植QT(2)---移植QT

    准备:ubantu12.04   内核 3.0.8(最好用同样的内核,3.2.0时没成功) 交叉编译工具:arm-cortex_a8-linux-gnueabi-gcc-4.4.6 QT版本5.4.2 ...

  5. Mybatis-Plus 实战完整学习笔记(四)------全局参数配置

    一.全局配置设置 (1)全局配置Id自动生成 <!--定义mybatisplus全局配置--> <bean id="globalConfig" class=&qu ...

  6. 二级缓存EhCache在几种应用技术的配置方法和步骤总结

    一:Spring和Ehcache缓存集成 业务问题:如果仓库不经常变动,大量进出库,总是需要查询仓库列表 (列表重复) ,使用缓存优化 ! 阅读spring规范29章节 第一步: 导入ehcache的 ...

  7. JS中的计时器事件

    JS可以实现很多java代码不易完成的功能.这里学习一些js中的计时器事件. JavaScript 一个设定的时间间隔之后来执行代码,称之为计时事件. 主要通过两个方法来实现: 1.setInterv ...

  8. java高精度实数和小数

    java 高精度实数和小数 String s = "1231222222222222222222222222222222222222222222222222222222"; Big ...

  9. hadoop集群的三种运行模式

    单机(本地)模式: 这种模式在一台单机上运行,没有分布式文件系统,而是直接读写本地操作系统的文件系统.在单机模式(standalone)中不会存在守护进程,所有东西都运行在一个JVM上.这里同样没有D ...

  10. java http大文件断点续传上传

    因为需要研究下断点上传的问题.找了很久终于找到一个比较好的项目. 效果: 上传中,显示进度,时间,百分比. 点击[Pause]暂停,点击[Resume]继续. 2,代码分析 项目进行了封装使用最简单的 ...