D3.js:了解选择并与VanillaJavaScript进行比较

来自菜鸟教程
跳转至:导航、​搜索

本文旨在展示选择如何在 D3 中工作。 我们将从一个基本项目开始,其中包含 d3.js 作为没有构建系统的脚本:

<!DOCTYPE html>
<html lang="en">
  <head>
    <title>D3: Selections</title>
  </head>
  <body>
    <div class="about-me">
      <p>Hi! My name is Paul and here's some facts about me.</p>
      <ul id="list">
        <li>I'm a powerlifter</li>
        <li>I'm studying MSc Data Science</li>
        <li>I love D3.js!</li>
      </ul>
    </div>

    <script src="https://d3js.org/d3.v5.min.js"></script>
    <script src="main.js"></script>
  </body>
</html>

考虑一下我们如何在没有 D3 的情况下进行选择和修改 DOM 元素:

const listItems = [...document.getElementsByTagName('li')];

listItems.map(item => item.style.setProperty('font-weight', 'bold'));

虽然现在这不是很复杂,但我们可以预期,随着我们的扩展,事情会变得越来越难推理。 这就是我们需要考虑 D3 的原因。

D3 中的选择

请注意,当我们想要操作 DOM 中的 多个 元素时,我们必须对它们进行 映射 。 D3 选择允许我们查询页面上的 一个或多个 元素,并允许我们操作整个选择而不需要我们进行迭代。

它使用标准的 CSS 选择器语法,因此您可以期望通过元素的名称、具有 .about-me 的类、具有 #list 的 id 等来查询元素。

我们可以从 DOM 中选择元素:

  • select() 从 DOM 中获取 one 元素。 如果有多个匹配项,则只取第一个匹配项。
  • selectAll() 从 DOM 中获取 all 元素。

例子

让我们用一个代码示例来看看这个。 可以在一行中完成与我们的 vanilla JavaScript 示例相同的操作:

const li = d3.selectAll('li').style('font-weight', 'bold');

如您所见,它返回一个元素集合,我们可以将这些元素链接到其他方法中,例如 style

如果我们将其更改为 select 而不是 selectAll,您会注意到 I'm a powerlifter 是唯一一个加粗的 li - 这是预期的,因为它是DOM 中的第一个 li

附加一个新的列表项

为了进一步展示选择的力量,考虑一下我们可能希望如何使用 JavaScript 向 DOM 添加一个新的 li

const ul = document.getElementsByTagName('ul')[0];

const newItem = document.createElement('li');

newItem.appendChild(document.createTextNode(`I'm learning about selections.`));

ul.appendChild(newItem);

再一次,当我们想要创建复杂的数据可视化时,这并不是最好的工作流程。 让我们看一下 D3 的相同示例:

const ul = d3.select('ul');

ul.append('li').text(`I'm learning about selections`);

容易多了! 每个函数都返回先前更改或查询的更新值,使我们能够以一种强大的方式将方法链接在一起。

子选择

我们还可以在 我们的选择中选择项目。 让我们通过从我们的 ul 选择中选择第一个 li 并将其变为红色来看看这个:

const ul = d3.select('ul');

ul.select('li').style('color', 'red');

ul.append('li').text(`I'm learning about selections`);

如您所见,我们不仅限于初始选择。 我们可以继续进行子选择并更具体地了解我们的实施。

选择是什么样的?

让我们使用 console.log 来检查我们的 select 查询以查看返回的内容:

{
  _groups: [Array(1)]
  _parents: [html]
}

如果我们展开 _groups,您会看到它根据选择返回我们的 ul。 如果我们将选择更改为 selectAll('li'),则 _groups 返回一个 Array,其中包含 NodeList(3) 内的 li 集合。

const li = d3.selectAll('li');

console.log(li);
_groups: Array(1)
  0: NodeList(3)
    0: li
    1: li
    2: li
_parents: [html]

自然,_parents 对象包含此选择的父对象,即根 html 对象。

现在就是这样! 请继续关注有关使用 D3.js 的更多信息。