如何在 D3.js 的 join 操作中正确访问每个进入元素的绑定数据

雨辰小哥_5514

雨辰小哥_5514

2026-10-02

796人浏览

原创

如何在 D3.js 的 join 操作中正确访问每个进入元素的绑定数据

在 D3.js v7+ 中,join 的 enter 回调函数内无法直接按元素获取对应 datum(.datum() 仅返回首个数据项),需改用 selection.each() 遍历每个 DOM 节点并结合当前数据 d 实例化逻辑。

在 d3.js v7+ 中,`join` 的 enter 回调函数内无法直接按元素获取对应 datum(`.datum()` 仅返回首个数据项),需改用 `selection.each()` 遍历每个 dom 节点并结合当前数据 `d` 实例化逻辑。

D3.js 的 .join() 方法是声明式数据绑定的核心,但其 enter/update/exit 回调函数的设计初衷是批量操作,而非逐元素上下文感知。正如示例所示:当在 enter 回调中调用 enter.datum(),它返回的是整个 enter selection 的第一个绑定数据(即 data[0]),而非当前正在处理的元素所对应的 datum——这导致无法为每个 <li> 正确初始化不同 n 值的 Rects 实例。

✅ 正确做法是:先执行 .join() 获取完整 selection(含 enter、update、exit),再对 enter selection(或通用 selection)调用 .each((d, i, nodes) => { ... })。在 each 回调中,参数 d 即为当前 DOM 元素(nodes[i])所绑定的数据对象,可安全用于构造器参数、条件判断或动态配置。

以下是重构后的关键代码段(已优化可读性与健壮性):

Json Schema Toolkit
Json Schema Toolkit

使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。

下载
const data = [{n: 3, text: 'some text'}, {n: 2, text: 'some other text'}];

const listItems = d3.select('#root')
  .selectAll('li')
  .data(data)
  .join('li'); // 返回包含 enter/update 的 selection

// ✅ 在 each 中访问每个元素的完整 datum
listItems.each(function(d, i) {
  const li = d3.select(this); // 当前 
  • 元素 const rects = new Rects(d.n); // 使用 d.n 实例化 —— 数据驱动! li.text(`There should be ${d.n} rects:`) .append('svg') .attr('width', d.n * 20 + 20) .attr('height', 20) .append('g') .attr('transform', 'translate(20,0)') .selectAll('rect') .data([...Array(d.n).keys()]) .join('rect') .attr('x', (i) => i * 20) .attr('y', 0) .attr('width', 20) .attr('height', 20) .attr('fill', (_, i) => ['purple', 'forestgreen', 'orange'][i % 3]); });

    ⚠️ 注意事项:

    • 不要依赖 enter.datum() 获取单个元素数据——它是 selection 级方法,非元素级;
    • each() 中的 this 指向原生 DOM 元素,务必用 d3.select(this) 包装以使用 D3 方法;
    • 若需区分 enter/update 逻辑(如仅对新元素初始化),可用 li.filter((d, i, nodes) => nodes[i].__data__ === d) 或配合 selection.enter() 提前捕获,但多数场景 each 已足够;
    • Rects.draw() 原实现中硬编码了 this.#domain,实际可简化为直接传入 d.n,避免类耦合,提升复用性。

    该模式体现了 D3 “数据驱动文档” 的本质:数据决定行为,每个元素在其上下文中独立响应自身数据。掌握 selection.each() 是突破 join 抽象层、实现精细化控制的关键一步。

  • 相关文章

    PHP速学视频免费教程(入门到精通)
    PHP速学视频免费教程(入门到精通)

    PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

    下载

    相关标签:

    js

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    html5动画制作有哪些制作方法
    html5动画制作有哪些制作方法

    html5动画制作方法有使用CSS3动画、使用JavaScript动画库、使用HTML5 Canvas等。想了解更多html5动画制作方法相关内容,可以阅读本专题下面的文章。

    2023.10.23

    3691

    6

    HTML与HTML5的区别
    HTML与HTML5的区别

    HTML与HTML5的区别:1、html5支持矢量图形,html本身不支持;2、html5中可临时存储数据,html不行;3、html5新增了许多控件;4、html本身不支持音频和视频,html5支持;5、html无法处理不准确的语法,html5能够处理等等。想了解更多HTML与HTML5的相关内容,可以阅读本专题下面的文章。

    2024.03.06

    6168

    6

    html5从入门到精通汇总
    html5从入门到精通汇总

    想系统掌握HTML5开发?本合集精选全网优质学习资源,涵盖免费教程、实战项目、视频课程与权威电子书,从基础语法到高级特性(Canvas、本地存储、响应式布局等)一应俱全,适合零基础小白到进阶开发者,助你高效入门并精通HTML5前端开发。

    2025.12.30

    774

    19

    html5新老标签汇总
    html5新老标签汇总

    HTML5在2026年持续优化网页语义化与交互体验,不仅引入了如<header>、<nav>、<article>、<section>、<aside>、<footer>等结构化标签,还新增了<video>、<audio>、<canvas>、<figure>、<time>、<mark>等增强多媒体与

    2025.12.30

    654

    12

    html5空格代码怎么写
    html5空格代码怎么写

    在HTML5中,空格不能直接通过键盘空格键实现,需使用特定代码。本合集详解常用空格写法:&nbsp;(不间断空格)、&ensp;(半个中文空格)、&emsp;(一个中文空格)及CSS的white-space属性等方法,帮助开发者精准控制页面排版,避免因空格失效导致布局错乱,适用于新手入门与实战参考。

    2025.12.30

    353

    8

    html5怎么做网站教程
    html5怎么做网站教程

    想从零开始学做网站?这份《HTML5怎么做网站教程》合集专为新手打造!涵盖HTML5基础语法、页面结构搭建、表单与多媒体嵌入、响应式布局及与CSS3/JavaScript协同开发等核心内容。无需编程基础,手把手教你用纯HTML5创建美观、兼容、移动端友好的现代网页。附实战案例+代码模板,快速上手,轻松迈出Web开发第一步!

    2025.12.31

    481

    12

    HTML5建模教程
    HTML5建模教程

    想快速掌握HTML5模板搭建?本合集汇集实用HTML5建模教程,从零基础入门到实战开发全覆盖!内容涵盖响应式布局、语义化标签、Canvas绘图、表单验证及移动端适配等核心技能,提供可直接复用的模板结构与代码示例。无需复杂配置,助你高效构建现代网页,轻松上手前端开发!

    2025.12.31

    318

    7

    html5怎么使用
    html5怎么使用

    想快速上手HTML5开发?本合集为你整理最实用的HTML5使用指南!涵盖HTML5基础语法、主流框架(如Bootstrap、Vue、React)集成方法,以及无需安装、直接在线编辑运行的平台推荐(如CodePen、JSFiddle)。无论你是新手还是进阶开发者,都能轻松掌握HTML5网页制作、响应式布局与交互功能开发,零配置开启高效前端编程之旅!

    2025.12.31

    541

    20

    html5怎么播放视频
    html5怎么播放视频

    想让网页流畅播放视频?本合集详解HTML5视频播放核心方法!涵盖<video>标签基础用法、多格式兼容(MP4/WebM/OGV)、自定义播放控件、响应式适配及常见浏览器兼容问题解决方案。无需插件,纯前端实现高清视频嵌入,助你快速打造现代化网页视频体验。

    2025.12.31

    498

    20

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    WEB前端教程【HTML5+CSS3+JS】
    WEB前端教程【HTML5+CSS3+JS】

    共101课时 | 20.7万人学习

    JS进阶与BootStrap学习
    JS进阶与BootStrap学习

    共39课时 | 4.7万人学习