上一节给大家讲述额绑定数据的原理。当数组的长度与元素的数量不一致时,有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. mysql之存储引擎和文件配置

    (查看系统服务,在运行里输入services.msc) 补充:将mysql做成系统服务:mysqld --install 取消:mysqld --romove 在服务中可以直接鼠标操作mysql服务的 ...

  2. 2018.11.24 spoj New Distinct Substrings(后缀数组)

    传送门 双倍经验(弱化版本) 考虑求出来heightheightheight数组之后用增量法. 也就是考虑每增加一个heightheightheight对答案产生的贡献. 算出来是∑∣S∣−heigh ...

  3. tp5系统核心设计提供了一些可能会需要的钩子(位置)

    钩子    描述 参数 app_init 应用初始化标签位 无 app_begin 应用开始标签位 当前调度信息 module_init 模块初始化标签位 当前请求对象实例 action_begin ...

  4. 将驼峰转化为下化线(将型如AbcDef转化为abc_def)

    strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', 'AbcDef'))

  5. vue 开发系列(七) 路由配置

    概要 用 Vue.js + vue-router 创建单页应用,是非常简单的.使用 Vue.js ,我们已经可以通过组合组件来组成应用程序,当你要把 vue-router 添加进来,我们需要做的是,将 ...

  6. 将excel中的数据填入word模板中-VBA

    首先将word模板中需要填写excel中数据的空白处用自己独特的字符串标记,比如   数据001  什么的.如下图: 这样,就可以用vba搜寻这些自己独特的标记来根据excel内容填充word了. 第 ...

  7. ZOJ 2132 The Most Frequent Number (贪心)

    题意:给定一个序列,里面有一个数字出现了超过 n / 2,问你是哪个数字,但是内存只有 1 M. 析:首先不能开数组,其实也是可以的了,后台数据没有那么大,每次申请内存就可以过了.正解应该是贪心,模拟 ...

  8. 如何使用阿里巴巴iconfont矢量图片

    ①打开此网站http://www.iconfont.cn/ , 选择需要的几个图形 → 加入购物车 → 添加至项目 → 给项目随便命名 → 点击电线连接并点击代码 → 复制代码到css ②在body里 ...

  9. slice()

    提取字符串中的一部分,并返回这个新的字符串 str.slice(beginSlice[, endSlice]) 参数 beginSlice 从该索引(以 0 为基数)处开始提取原字符串中的字符.如果值 ...

  10. java基础-day22

    第11天  多线程 今日内容介绍 u  多线程概述 u  线程实现 u  多线程安全问题产生 & 解决方案 第1章    多线程概述 学习多线程之前,我们先要了解几个关于多线程有关的概念. A ...