上一节给大家讲述额绑定数据的原理。当数组的长度与元素的数量不一致时,有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. 数学小知识点整理(TBC)

    文章目录 前言 素数与同余 线性筛部分 素数 线性递推逆元 指数循环节降幂 当求逆元时模数与求逆元的数有可能不互质时的处理方法 一个神奇的结论 拓展欧拉定理 杂乱的一些性质/技巧 二进制枚举子集 异或 ...

  2. 2018.06.26「TJOI2018」数学计算(线段树)

    描述 小豆现在有一个数 xxx ,初始值为 111 . 小豆有 QQQ 次操作,操作有两种类型: 111 $ m$ : x=x×mx=x×mx=x×m ,输出 xxx modmodmod MMM : ...

  3. vue的子传父

    子组件传值给父组件,需要触发一个事件. 在这个事件里,使用this.$emit("父组件使用的名称","子组件的数据") 在父组件中引用的子组件,在子组件的标签 ...

  4. telegraph.conf配置

    原文:http://www.cnblogs.com/smail-bao/p/7002361.html 1.操作系统基础监控指标配置标准 基础监控使用通用的全局配置文件telegraf.conf,以下只 ...

  5. 更改Ubuntu默认python版本的两种方法python-> Anaconda

    当你安装 Debian Linux 时,安装过程有可能同时为你提供多个可用的 Python 版本,因此系统中会存在多个 Python 的可执行二进制文件.一般Ubuntu默认的Python版本都为2. ...

  6. HDU 1003 MAXSUM(最大子序列和)

    Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub ...

  7. JAVA 面试题及思考

    ==================================== =======学而时习之======================== ===================== 1. p ...

  8. 《深入浅出MFC》系列之运行时类型识别(RTTI)

    /********************************************************************************** 发布日期:2017-11-13  ...

  9. 【转】Javascript基本类型和引用类型的区别

    根据[转贴]进一步补充 今天明白了一个困扰很久的问题:引用类型和基本类型的区别与联系要明白这个问题,首先需要理解堆栈的概念.那什么又是堆栈,有什么区别和联系呢?堆:首先堆是动态分配的,JVM并不会自动 ...

  10. python在使用redis时zadd错误

    最近在看<redis实战>,在写zadd时报错 Traceback (most recent call last): File "<stdin>", lin ...