D3JsDay09 资料元素来绑定,让你元素有内定—资料绑定

资料绑定

datum()函式

前面的文章多半是在使用D3来操作DOM,这边主要探讨D3的核心,将资料绑定在DOM的元素中,换句话说DOM的元素样貌可以透过资料来改变,例如当资料数值是比较大的情况时,你所绘制的div或是svgcircle半径也随之变大。

先看以下范例

首先我们先创建一个阵列,然後使用for回圈以阵列长度作为回圈数,之後依序添加div这边有一个特别的datum()函式,我们尝试着将每一笔的阵列内容放入函式当中当作参数,最後加入text()函式在其中放入一个回呼函式参数加入d并且return出来就可以看到画面呈现。

const arr = [7,2,5,4,13];
for(let i=0; i<arr.length; i++){    
  d3.select("body")
  .append("div")
  .datum(arr[i])
  .text(function(d){
      return d;
  })
}

画面呈现如下图
https://ithelp.ithome.com.tw/upload/images/20210924/20125095uELbaAzEu8.png
这时候可以发现在添加的div透过datum()绑定上去了,你可以尝试着将上述第5行的 .datum(arr[i])注解掉应该会发现网页画面的数字不见了。另一个方式你可以撰写console.log印出里面的div包含的data讯息

程序码如下

const arr = [7,2,5,4,13];
  for(let i=0; i<arr.length; i++){    
    d3.select("body")
    .append("div")
    .datum(arr[i])
    .text(function(d){
        return d;
    })
  }
const allDataInDiv = d3.select("body").selectAll("div")["_groups"][0];
  for(let i=0; i<allDataInDiv.length;i++){
      console.log(allDataInDiv[i]);
}

开启开发人员工具可以发现div被添加了__data__在里面,如下图

https://ithelp.ithome.com.tw/upload/images/20210924/20125095V0w7dY9D25.png

所以我们才可以透过text()回呼函式来获得d参数,而d所表示的就是资料的意思

data()函式

查看以下程序码我们预先在body撰写空的div,这次使用selectAll来一次选取所有的div并且改用data()放入整个阵列,此时一样可以达到之前所用datum()范例所创立的样貌,因此可以这麽理解是data()将阵列的各项分别绑定到选择的各元素

<body>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
    <div></div>
  <script>
     const arr = [7,2,5,4,13];
     d3.select("body")
     .selectAll("div")
     .data(arr)
     .text(function(d){ return d});
  </script>
</body>

data()和datum比较

datum的差异你可以将.data(arr)换成.datum(arr)之後看画面呈现更能看得出其中的奥妙

<body>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>

  <script>
    let arr = [7,2,5,4,13];
    d3.select("body")
    .selectAll("div")
    .datum(arr)
    .text(function(d){ return d});
  </script>
</body>

此时你会看到如下图,datum()会直接将整个阵列绑在每一个div上面,多半我们在处理资料的时候会使用data()来绑定较为容易。
https://ithelp.ithome.com.tw/upload/images/20210924/201250953XZ4zvoJCq.png

透过函式将样式改变

若我们希望在大於6的数值就呈现红色的话,我们透过style()操作它的样式,由於已经绑定资料在元素上,因此我们一样可以在第二个参数带入d承接资料并透过if来判断大於6的函式return红色

const arr = [7,2,5,4,13];
   d3.select("body")
   .selectAll("div")
   .data(arr)
   .text(function(d,i,n){ 
     return d;
    })
    .style(
        "color",function(d){
        if(d>6){
            return "red";
        }
    });

结果呈现如下图
https://ithelp.ithome.com.tw/upload/images/20210924/20125095Upvjt11xog.png

关於data和text的函式的其他说明

text()函式介绍

text在绑定之後 函数 可以拥有三个参数,第一个参数是d表示data的意思,第二个参数是i表示阵列的索引值,第三个参数表示当前绑定的群组节点

你可以将下列程序码执行看看并且开启开发者人员工具。

<body>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <div></div>
  <script>
     const arr = [7,2,5,4,13];
     d3.select("body")
     .selectAll("div")
     .data(arr)
     .text(function(d,i,n){ 
         console.log(d);
         console.log(i);
         console.log(n);
    });
  </script>
</body>

这边撷取第一次回圈所呈现的图片,7表示阵列第一笔资料,0表示index索引值,最後的n表示当前绑定的元素节点
https://ithelp.ithome.com.tw/upload/images/20210924/20125095sstZV8Y8VB.png

参考官方textAPI说明

另外data()datum没有带入参数的时候可以得到绑定的数据
下面程序码以data()为例

const arr = [7,2,5,4,13];
   d3.select("body")
   .selectAll("div")
   .data(arr)
   .text(function(d,i,n){ 
     return d;
});
console.log(    d3.select("body")
   .selectAll("div")
   .data());

或是以datum()为例

let arr = [7,2,5,4,13];
   d3.select("body")
   .selectAll("div")
   .data(arr)
   .text(function(d,i,n){ 
     return d;
});
console.log(
    d3.select("body")
   .select("div")
   .datum()
);

以上就是关於资料绑定的部分 下一篇将会介绍关於资料绑定时候需要注意的细节。


<<:  day9 Kotlin coroutine 的黑魔法 suspend

>>:  C#入门之字符串转义

30天零负担轻松学会制作APP介面及设计【DAY 11】

大家好,我是YIYI,今天我要利用MARVEL将前面三个介面做出连结。 制作介面连结 首先,先进入昨...

IOS、Python自学心得30天 Day-23 Firebase衔接Python-1

前言: 之前提到 我一直在想办法让原本的训练模型 转成IOS可以用的模型 但找了许多方法後 还是没成...

开发环境与部署环境不同时的解决方案

我的开发环境是ubuntu20,但是部署环境是ubuntu18; 开发的语言是python,出现了一...

Python - 根据输入的英文字母排列出有意义的单词-参考笔记

Python - 根据输入的英文字母排列出有意义的单词-参考笔记 参考资料 Day26- pytho...

Day4.Cortex-M 系列 基础探讨

Overview ARM Architecture 从第七代开始,分为三种配置(Profile) A...