一、简介D3.js是什么

  1. 一款基于JavaScript的函数库
  2. 借助HTML、SVG和CSS等实现可视化
  3. 组件强大,通过数据驱动的方式来操作DOM

    D3.js堪称SVG中的jQuery

二、vue引入D3.js

1. 安装d3

  1. npm install d3 --save-dev
  2. 或者
  3. cnpm install d3 --save-dev

2. 引入d3

  1. <template>
  2. <div></div>
  3. </template>
  4. <script>
  5. import * as d3 from 'd3'; //引入d3
  6. export default {
  7. data() {
  8. return {}
  9. },
  10. }
  11. </script>

三、基础操作

1. 选择元素

  • d3.select():选择所有指定元素的第一个
  • d3.selectAll():选择指定元素的全部
    1. var body = d3.select("body"); //选择文档中的body元素
    2. var p1 = body.select("p"); //选择body中的第一个p元素
    3. var p = body.selectAll("p"); //选择body中的所有p元素
    4. var svg = body.select("svg"); //选择body中的svg元素
    5. var rects = svg.selectAll("rect"); //选择svg中所有的rect元素
    6. var id = body.select("#myid"); //选择id为myid的元素
    7. var kind = body.selectAll(".myclass"); //选择class为myclass的元素

2. 插入元素

对页面上已存在的html元素,insert、append会在已存在的元素中添加新的子节点;
对于页面中不存在的元素,它们则是直接添加新增的元素,而非子节点。

① append()

在选择集末尾插入元素,且只能在末尾插入元素

  1. <template>
  2. <div>
  3. <p>1</p>
  4. <p>1</p>
  5. </div>
  6. </template>
  7. <script>
  8. mounted() {
  9. d3.select("body").append("p").text("append了一个p标签")
  10. }
  11. </script>

image.png

② insert()

在选择集前面插入元素,可以指定将新元素插入在什么位置

  1. <template>
  2. <div>
  3. <p>1</p>
  4. <p id="myid">1</p>
  5. </div>
  6. </template>
  7. <script>
  8. mounted() {
  9. d3.select("body").insert("p", "#myid").text("append了一个p标签")
  10. }
  11. </script>

image.png

3. 删除元素

  • remove():删除一个元素

    1. <template>
    2. <div>
    3. <p>1</p>
    4. <p id="myid">1</p>
    5. </div>
    6. </template>
    7. <script>
    8. mounted() {
    9. d3.select("body").select("#myid").remove()
    10. }
    11. </script>

    image.pngimage.png

    4. 绑定数据

  • datum():绑定一个数据到选择集上

  • data():绑定一个数组到选择集上,数组的各项值分别与选择集的各元素绑定

    假设现在有三个p标签

  1. <p>first</p>
  2. <p>second</p>
  3. <p>third</p>

① datum()

假设有一个字符串”info”,现在要把该字符串与三个p标签分别绑定

  1. var str = "info";
  2. var body = d3.select("body");
  3. var p = body.selectAll("p");
  4. p.datum(str);
  5. p.text(function (d, i) {
  6. return "第 " + i + " 个元素绑定的数据是 " + d;
  7. });

image.png image.png
上述的代码中,使用到了一个无名函数 function(d, i),其中包含两个参数:

  • d 代表数据,也就是与某元素绑定的数据
  • i 代表索引,代表数据的索引号,从 0 开始

    ② data()

    假设有一个数组,现在要分别将数组的各元素绑定到三个p标签上
    1. var dataList = ["red","blue","yellow"];
    2. var body = d3.select("body");
    3. var p = body.selectAll("p");
    4. p.data(dataList).text(function (d, i) {
    5. return "第 " + i + " 个元素绑定的数据是 " + d;
    6. });
    image.png image.png
    上述的代码中,也使用到了一个无名函数 function(d, i),两个参数的含义与上面相同。
    唯一与之不同的是,此时三个p标签内元素与dataList中的三个字符串是一一对应的关系,我们直接在function中return d即可。

5. 根据数据选中元素进行增减

① enter()

data()绑定数据到选择的DOM元素上,这样就可以针对这些数据做一些相关操作,比如设置元素宽高等。
当DOM数量少于data的数量,或者一个都没有的时候,我们想要程序帮我们自动创建,而enter()是用来在绑定数据之后,选择缺少的那部分DOM元素。可以理解为我们选择了一些不存在的东西,“虚拟DOM”或“占位符”。
因为enter()只是进行选择,并未实际添加所需DOM元素。因此在enter()之后一般都会配合append()来进行DOM元素的实际创建。

  1. <template>
  2. <div>
  3. <p>1</p>
  4. <button @click="start">开始</button>
  5. </div>
  6. </template>
  7. <script>
  8. start() {
  9. // 无append
  10. d3.select("body").selectAll("p").data([1, 2, 3]).enter().text(function (d, i) {
  11. return "第 " + i + " 个元素绑定的数据是 " + d;
  12. });
  13. // 有append
  14. d3.select("body").selectAll("p").data([1, 2, 3]).enter().append("p").text(function (d, i) {
  15. return "第 " + i + " 个元素绑定的数据是 " + d;
  16. });
  17. }
  18. </script>

image.png image.png image.png

② exit()

与上面相反,当DOM数量多于data的数量,我们想要程序帮我们自动删除,使DOM数量与绑定数据的数量相等,所以exit()后面就要跟 remove 操作,把多余输入数据数量的其它元素全部删掉。

  1. <template>
  2. <div>
  3. <p>a</p>
  4. <p>b</p>
  5. <p>c</p>
  6. <p>d</p>
  7. <button @click="start">开始</button>
  8. </div>
  9. </template>
  10. <script>
  11. start() {
  12. // 无remove
  13. d3.select("body").selectAll("p").data([1, 2]).exit().text(function (d, i) {
  14. return "第 " + i + " 个元素绑定的数据是 " + d;
  15. });
  16. // 有remove
  17. d3.select("body").selectAll("p").data([1, 2]).exit().remove().text(function (d, i) {
  18. return "第 " + i + " 个元素绑定的数据是 " + d;
  19. });
  20. }
  21. </script>

image.png image.png image.png