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 的更多信息。