数据绑定:
  将数据绑定到Dom上,是D3最大的特色。d3.select和d3.selectAll返回的元素的选择集。选择集上是没有数据的。
  数据绑定就是使被选择元素里“含有”数据。 相关函数有两个:
    selection.datum([value]) :
      选择集中的每一个元素都绑定相同的数据value
    selection.data() :
      选择集中的每一个元素分别绑定数据value的每一项。key是一个键函数,用于指定绑定数组时的对应规则。
 
datum()的工作过程:
  datum()绑定数据的方法很简单,可能使用的会比较少,但在某些时候还是会派上大用处的。
  首先在id为body的div中定义4个p元素,如下 :
  (d3.js在react框架中如何操作就不详细介绍了,有看不明白的请点 :https://www.cnblogs.com/littleSpill/p/10776429.html
 1     render() {
 2         return (
 3             <div id="body" >
 4                 <p>窗前明月光</p>
 5                 <p>疑是地上霜</p>
 6                 <p>举头望明月</p>
 7                 <p>低头思故乡</p>
 8             </div>
 9         );
10     }
 
然后绑定数值666到以上p元素后面中:
 1  oneMethod() {
 2
 3         //选择id为body的容器内的所有的p元素,将选择集结果赋值给变量p
 4
 5         var p = d3.select("#body")
 6             .selectAll("p")
 7
 8
 9         // 绑定数值666到选择集上
10         p.datum(666)
11
12         // 在控制台上输出选择集
13         console.log(p)
14
15         //在控制台输出绑定的数据
16         console.log(p.datum())
17     }
 
 
 其中console.log(p)显示的效果是 :
 
 
 
以上图一是打印出来的结果,是四个p元素。从图二可以看出,每个p元素都会多出一个__data__属性,这是被绑定数据之后才会出现的,属性值为我们绑定的数值666。
 
那么datum的工作过程就可以明白了。即对于选择集中的每一个元素,都为其增加一个__data__属性,属性值为datum(value)的参数value.此处的value可以是number(数值型)、string(字符串型)、和boolean(布尔型)和object(对象),无论是什么类型,其工作过程都是给__data__赋值。如果使用undefined和null作为参数,则将不会创建__data__属性。接下来的问题是,我绑定数据了,该怎么使用呢?
 
首先我们看一下console.log(p.datum())的结果。想必大家都大概知道了,对没错就是我们绑定的数值 : 666。
 
然后我们先在每个p元素里插入了span标签。然后把绑定的数据放到span标签里。 代码 : 
1   // 绑定数值666到选择集上
2         p.datum(666)
3          .append("span")
4          .text(function (d, i) {  //text的参数是一个无名函数function(d,i),无名函数里的两参数分别代表数据(datum)和索引(index)
5             return " " + d      //其实,无名函数两个参数的名称不一定要用d和i,但意义不变,按照惯例,建议写成d和i
6        })
显示效果图 : 
 
 
data()的工作过程:
  datum()将绑定的数据全部绑定到各个元素里,如果我们各个元素想要绑定的数据不一样怎么办?那就会用到data()了。
 
  data()能将数组各项分别绑定到选择集的各元素上,并且能指定绑定的规则。当数组的长度与元素的数量不一致时,data()也能够处理。当数组长度大于元           素数量时,为多余数据预留元素位置,以便将来插入          新元素。当数组长度小于元素数量时,能获取多余元素的位置,以便将来删除。
  接下来剖析data()时如何绑定数据的。
 
  现在要将一个数组的各项分别绑定到各元素上。假设,数组为["光光", "霜霜", "月月", "乡乡"], 然后令第一个p元素绑定"光光"。第二个p元素绑定"霜霜',第      三个p元素绑定"月月",第四个p元素绑定"乡乡"。这           种情况就得使用data()了,如果使用datum()的话,则会将数组本身绑定到各元素上。即每个p元       素都会绑定["光光", "霜霜", "月月", "乡乡"]。
 1     oneMethod() {
 2
 3         //定义数组
 4         var dataList = ["光光", "霜霜", "月月", "乡乡"];
 5
 6         // 选择id为body的容器内的所有的p元素,将选择集结果赋值给变量p
 7         var p = d3.select("#body")
 8             .selectAll("p")
 9
10         // 绑定数据到选择集
11         var update = p.data(dataList)
12                 .append("span")
13                 .text(function(d,i){
14                     return " " + d
15                 })
16                 .style("color","red")
17
18     }
 显示效果 : 
  上例中,数组长度与元素数量正好相等。但是两者也有不相等的情况,如果数组长度为5,而元素数量为3,则多出连个数据没有绑定元素。
  如果数组长度为1,元素数量为3,则会有两个元素没有绑定数据。在D3中,根据数组长度和元素数量的关系,可以把情况归纳如下。
    update : 数组长度 = 元素数量。
    enter : 数组长度 > 元素数量。
    exit : 数组长度 < 元素数量。
  看图 :
 
 
data()的绑定顺序 :
  默认情况下,data()是按索引号顺序绑定的 : 第0个元素绑定数组第0项,第一个元素绑定数组第1项,以此类推。也可以不按此顺序进行,这就要用到          data()·的第二个参数。此参数是一个函数,称为键函数。
    注意 : 只有在选择集原来已经绑定有数据的情况下,使用键函数才有效果。
    看示例 :
1     render() {
2         return (
3             <div id="body" >
4                 <p></p>
5                 <p></p>
6                 <p></p>
7             </div>
8         );
9     }

 1   oneMethod() {
 2
 3         //定义数据
 4         var dataList = [
 5             { id: 3, name: "张三" },
 6             { id: 6, name: "李四" },
 7             { id: 9, name: "王五" }
 8         ];
 9
10         // 选择id为body的容器内的所有的p元素,将选择集结果赋值给变量p
11         var p = d3.select("#body")
12             .selectAll("p")
13
14         // 绑定数据并修改p元素的内容
15         p.data(dataList)
16             .text(function(d){
17                 return d.id + ":" + d.name
18             })
19
20
21         //根据键函数的规则绑定数据,并修改内容
22         p.data(dataList, function (d) { return d.id})
23             .text(function (d) {
24                 return d.id + ":" + d.name
25             })
26
27     }
 
 
接下来将dataList里的数据更新,再绑定一次数据。这次绑定添加键函数。
 
 1     oneMethod() {
 2
 3         //定义数据
 4         var dataList = [
 5             { id: 3, name: "张三" },
 6             { id: 6, name: "李四" },
 7             { id: 9, name: "王五" }
 8         ];
 9
10         // 选择id为body的容器内的所有的p元素,将选择集结果赋值给变量p
11         var p = d3.select("#body")
12             .selectAll("p")
13
14         // 绑定数据并修改p元素的内容
15         p.data(dataList)
16             .text(function(d,i){
17                 return d.id + ":" + d.name
18             })
19
20         //定义数据
21         dataList = [
22             { id: 6, name: "李四" },
23             { id: 9, name: "王五" },
24             { id: 3, name: "张三" }
25         ];
26
27         //根据键函数的规则绑定数据,并修改内容
28         p.data(dataList, function (d) { return d.id})
29             .text(function (d) {
30                 return d.id + ":" + d.name
31             })
32     }
 

键函数里只有一个语句return d.id , 表示使用数组项的id作为键。使用本次绑定的数据修改p元素的内容后,结果为 :
 
 
可以看到,结果并没有按照新dataList数组的次序(6:张三 9:李四 3:王五)排列。绑定顺序不按索引号绑定,而是使键值一次对应。
 
 
 
 
 
 
 
 

D3.js(v3)+react框架 基础部分之数据绑定及其工作过程与绑定顺序的更多相关文章

  1. D3.js (v3)+react框架 基础部分之认识选择集和如何绘制一个矢量图

    首先需要下载安装d3.js  :  yarn add d3 然后在组建中引入 :  import * as d3 from 'd3' 然后定义一个方法,在componentDidMount()这个钩子 ...

  2. D3.js(v3)+react 制作 一个带坐标与比例尺的柱形图 (V3版本)

    现在用D3.js + react做一个带坐标轴和比例尺的柱形图.我已经尽力把代码全部注释上了,最后我也会把完整柱形图代码奉上.如果还有疑惑的,可以去翻看一下我之前介绍的方法,以下方法都有介绍到. 还有 ...

  3. D3.js(v3)+react 制作 一个带坐标轴与比例尺的折线图

    本章使用路径生成器来绘制一个折线图.以中国和日本的GDP数据为例:   //数据 var dataList = [ { coountry : "china", gdp : [ [2 ...

  4. D3.js(v3)+react 制作 一个带坐标与比例尺的散点图 (V3版本)

    上一章做了柱形图,https://www.cnblogs.com/littleSpill/p/10835041.html   这一章做散点图.   散点图(Scatter Chart),通常是一横一竖 ...

  5. 用 D3.js 画一个手机专利关系图, 看看苹果,三星,微软间的专利纠葛

    前言 本文灵感来源于Mike Bostock 的一个 demo 页面 原 demo 基于 D3.js v3 开发, 笔者将其使用 D3.js v5 进行重写, 并改为使用 ES6 语法. 源码: gi ...

  6. 【 D3.js 选择集与数据详解 — 1 】 使用datum()绑定数据

    选择集和数据的关系是 D3 最重要的基础,在[入门 - 第 7 章]时进行过些许讲解,对于要掌握好 D3 是远远不够的.故此开设一个新的分类,专门讨论选择集与数据的关系,包括数据绑定的使用和工作原理, ...

  7. D3.js v5 Tutorials

    D3.js v5 Tutorials D3.js v5 教程 https://github.com/d3/d3/blob/master/API.md CHANGES https://github.co ...

  8. 跨平台框架与React Native基础

    跨平台框架 什么是跨平台框架? 这里的多个平台一般是指 iOS 和 Android . 为什么需要跨平台框架? 目前,移动开发技术主要分为原生开发和跨平台开发两种.其中,原生应用是指在某个特定的移动平 ...

  9. D3.js学习笔记(六)——SVG基础图形和D3.js

    目标 在这一章,我们将会重温SVG图形,学习如何使用D3.js来创建这些图形. 这里会包括前面例子中的SVG基础图形以及如何使用D3.js设置图形的属性. 使用D3.js画一个SVG 的 圆 circ ...

随机推荐

  1. 2019.01.24 NOIP训练 旅行(轮廓线dp)

    传送门 题意简述: 给一个n∗mn*mn∗m的有障碍的网格图,问你从左上角走到左下角并覆盖所有可行格子的路径条数. 思路: 路径不是很好算. 将图改造一下,在最前面添两列,第一列全部能通过,第二列只有 ...

  2. 2018.10.25 atcoder Leftmost Ball(计数dp+组合数学)

    传送门 dp妙题啊. 我认为DZYODZYODZYO已经说的很好了. 强制规定球的排序方式. 然后就变成了一个求拓扑序数量的问题. 代码: #include<bits/stdc++.h> ...

  3. 负载均衡下 tomcat session 共享

    概述 在分布式部署的情况下,每台tomcat 都会有自己的session ,这样如果 用户A 在tomcat1 下登录,在tomcat2 下并没有session信息.如果 tomcat1宕机,tomc ...

  4. Java之spilt()函数,trim()函数

    一.单个符号作为分隔符  package com.regix; public class FuncSpilt { public static void main(String[] args) { // ...

  5. 下载编译安装Apache HTTP Server 2.4.23以及配置HTTP/HTTPS反向代理

    http://blog.csdn.net/gangchengzhong/article/details/52910225 [注意,在编译make时出现的错误并不是文章中说的openssl的版本问题,而 ...

  6. UVa 11021 Tribles (概率DP + 组合数学)

    题意:有 k 只小鸟,每只都只能活一天,但是每只都可以生出一些新的小鸟,生出 i 个小鸟的概率是 Pi,问你 m 天所有的小鸟都死亡的概率是多少. 析:先考虑只有一只小鸟,dp[i] 表示 i 天全部 ...

  7. 好文推荐系列--------(1)bower---管理你的客户端依赖

    好文原文地址:http://segmentfault.com/a/1190000000349555 编者注:我们发现了比较有趣的系列文章<30天学习30种新技术>,准备翻译,一天一篇更新, ...

  8. linux ps查进程 kill关闭进程

    原文链接:http://blog.sina.com.cn/s/blog_53855ace0100ded4.html 首先,我们需要使用linux下另外一个ps命令查找与进程相关的PID号:ps aux ...

  9. 事件同步(一)-——CreateEvent( )事件对象实现线程同步

    事件对象分为两类:人工重置事件对象和自动重置事件对象.对于人工重置事件对象,可以同时有多个线程等待到事件对象,成为可调度线程. 对于自动重置事件对象,等待该事件对象的多个线程只能有一个线程成为可调度线 ...

  10. 返回结点值为e的二叉树指针

    题意为,如果二叉树某结点的值为e(假定是整型二叉树),返回这个结点的指针.初看这道题,联想到二叉树可以很简单的遍历,直接返回这个指针不就行了吗?如下图所示,假如要返回值为3的结点指针: 设计好了一个函 ...