发布时间:2026/9/7 6:58:59
D3 本地变量详解:d3.local 与 DOM 作用域状态的读写、继承与移除 D3 本地变量详解d3.local 与 DOM 作用域状态的读写、继承与移除【免费下载链接】d3Bring data to life with SVG, Canvas and HTML. :bar_chart::chart_with_upwards_trend::tada:项目地址: https://gitcode.com/GitHub_Trending/d3/d3D3 locals本地变量是 d3-selection 提供的一种把状态挂载到 DOM 元素上的机制它让状态的定义完全独立于数据绑定并支持沿祖先链自动继承。本文基于仓库中 locals 文档 的完整 API 内容展开并结合 package.json、src/index.js 与 api.md 等仓库证据说明local()、local.set、local.get、local.remove、local.toString五个 API 的用法、行为边界以及与其他状态存储方式的取舍。什么是 D3 locals适合什么场景D3 locals 允许定义独立于数据data的本地状态。典型场景是渲染时间序列数据的 small multiples小倍图你可能希望所有小图共享同一个 x 轴比例尺但每张图拥有各自独立的 y 轴比例尺以便对比各指标的相对表现。locals 的作用域规则以 DOM 元素为单位set 时值被存储在指定的元素上get 时值从指定元素读取若该元素未定义此 local则沿祖先链向上查找返回最近的定义了该 local 的祖先上的值若没有任何祖先定义则返回undefined。原文档给出了一条明确的官方提示值得原样保留CAUTIONLocals 很少被使用你往往会发现把需要的状态存储在 selection 的 data 中更简单。也就是说locals 的定位是“锦上添花”的细粒度控制手段而不是日常首选。local()声明一个新的本地变量const foo d3.local();local()用于声明一个新的本地变量。可以把它理解为 JS 的var的 DOM 化版本与var相同每个 local 都是一个独立的符号引用与var不同每个 local 的取值还按 DOM 作用域划分即同名 local 在不同元素上可以有不同取值。在完整打包的 d3 中local与整个 d3-selection 模块一起导出。从 src/index.js 可以看到umbrella 包通过export * from d3-selectionsrc/index.js#L24一次性暴露了d3.local在内的全部 selection API而 package.json 声明的依赖版本为d3-selection: ^3.0.0package.json#L61当前 umbrella 包版本为7.9.0。这意味着d3.local在 d3 v7 及 d3-selection v3 及以上版本中均可直接使用。local.set(node, value)向元素写入值selection.each(function(d) { foo.set(this, d.value); });local.set(node, value)把指定node上该 local 的值设置为value并返回被设置的value这一返回值使得 set 可以内嵌在表达式中使用。由于 set/get 的入参是具体的 DOM 节点而非 selection惯用写法是借助 selection.each 遍历选区在回调里用this引用当前元素。如果只是想给元素存储一个变量原文档建议直接考虑更简单的 selection.propertyselection.property(foo, (d) d.value);这里foo作为 local 变量对象传入会被用作属性名的字符串标识等价于以foo.toString()的标识为属性名调用 property。这一写法能成立的原因正是下一个小节要讲的 toString 机制。local.get(node)按祖先链回退的读取selection.each(function() { const value foo.get(this); });local.get(node)返回指定node上该 local 的值其查找规则是整个 locals 机制中最有特色的部分若node自身定义了该 local直接返回自身上的值若node未定义则返回最近的定义了该 local 的祖先的值若整条祖先链上都没有定义返回undefined。这种“就近继承”语义使得 small multiples 场景中的分工变得自然把共享的 x 比例尺 set 在图表容器的公共外层节点上把各自的 y 比例尺 set 在每个小图节点上小图内部的所有子元素坐标轴、网格线、文字等调用get(this)时x 比例尺从外层继承y 比例尺则命中所在小图自身的定义。祖先继承也意味着修改某个内层元素上的 local 不影响外层而删除内层定义后读取会回退到外层值见下文 remove。local.remove(node)删除元素上的定义selection.each(function() { foo.remove(this); });local.remove(node)删除指定node上该 local 的值其返回值为布尔型若删除前node自身定义了该 local返回true否则返回false。需要注意继承语义在删除后依然生效若祖先上也定义了该 local这些祖先定义不受影响因此 local.get 仍然会返回继承自祖先的值。换言之remove只清除“本节点自己的定义”让查找自然回退到祖先链而不是把值置空。local.toString()取回本地属性标识符local.toString()返回该 local 自动生成的标识符。这个标识符的实质意义是它正是用来在元素上存储该 local 值的属性名。因此除了 set/get/remove 之外你还可以通过原生属性访问读写同一个值element[local]—— 用 local 对象作为计算属性名直接读写底层属性local.toString()会在计算属性名时被自动调用selection.property —— 例如selection.property(foo, (d) d.value)即把foo.toString()的结果当作属性名。这一点把 locals 与 d3-selection 的其余修改类 API 打通了同一个 local 既可以用 locals API 管理也可以作为property的属性名使用两条路径读写的是元素上同一个位置的值。在 d3 项目中的位置与证据从仓库结构可以确认 locals 在 d3 生态中的归属与地位API 索引api.md 的 d3-selection 章节将 “Local variables” 列为 selection 的六大主题之一与 Selecting、Modifying、Joining、Events、Control flow 并列并逐条索引了d3.local、local.set、local.get、local.remove、local.toString五个条目api.md#L1096-L1102与本文覆盖范围一致。模块归属locals 属于 d3-selection 子模块umbrella 包通过 src/index.js 的 re-export 汇总暴露各 API 的实现源码位于 d3-selection 子仓库的src/local.js官方文档在每条 API 条目下均标注了对应的 Source 链接实现细节以该子模块为准。历史沿革CHANGES.md 记录了d3.local的引入动机CHANGES.md#L1208“提供定义本地变量的机制状态绑定到 DOM 元素并可供任何后代元素使用是使用 selection.each 或把状态存进 data 的便捷替代。” 这与本文开头描述的用途一致。locals 与 data、property 的取舍locals 是 d3 中三种“把值挂到元素上”的方式之一选择时可以从以下维度对照方式存储位置作用域/继承适用情形selection 的 datadata join与元素的 datum 绑定无祖先继承按数据索引取用状态与数据一一对应时的默认选择selection.property元素上的原生属性无祖先继承表单控件的value/checked等特殊属性或单变量存储d3.local元素上以自动生成标识符为名的属性有祖先继承get 沿祖先链回退状态需要跨层级共享、且不想混入数据绑定时的细粒度场景官方对 locals 的定位是克制而明确的它“很少被使用”。日常开发中优先把状态放进 selection 的 data 或用property存储只有当状态天然是“挂在 DOM 树某一层级、供整棵子树读取”的形态如 small multiples 中的共享比例尺、子组件间传递的渲染上下文时locals 的祖先继承语义才会体现出独特价值。小结d3.local()声明一个按 DOM 元素划分的本地变量是var的 DOM 作用域版本local.set(node, value)将值写入指定元素并返回该值通常配合selection.each使用单变量场景可退化为selection.property(foo, fn)local.get(node)读取值时沿祖先链回退未命中任何定义则返回undefined这是 locals 支持“公共配置挂外层、私有配置挂内层”模式的关键local.remove(node)仅删除本节点的定义并返回布尔值祖先定义不受影响删除后 get 会回退到继承值local.toString()暴露底层存储所用的属性名使element[local]与selection.property成为与 locals API 等价的读写路径。【免费下载链接】d3Bring data to life with SVG, Canvas and HTML. :bar_chart::chart_with_upwards_trend::tada:项目地址: https://gitcode.com/GitHub_Trending/d3/d3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/9/7 6:53:59

2024电赛H题自动行驶小车完整方案:从视觉识别到PID调参实战

简介:面向2024全国大学生电子设计竞赛H题自动行驶小车,参赛选手将完整方案整理开源,适合备战电赛或学习MSPM0系列单片机的开发者,尤其适合已有单片机基础、希望在赛题框架下快速上手的同学。资源包共89个文件,以C语言源…

2026/9/7 6:53:59

猫抓 cat-catch 浏览器资源嗅探扩展使用指南

猫抓 cat-catch 浏览器资源嗅探扩展使用指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓(cat-catch)是一款开源的浏…

2026/9/7 6:53:59

技术博文创作指南:从项目描述到SEO友好教程的完整搭建

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 15:45:13

TCP面试核心知识点全攻略:从三次握手到拥塞控制

1. 为什么TCP值得你花时间死磕TCP这块内容,几乎是每一场技术面试躲不过去的坎。无论是校招还是社招,无论是后端、客户端还是网络方向,面试官总喜欢从TCP切入,先问三次握手、四次挥手,再问流量控制、拥塞控制、粘包拆包…

2026/9/7 15:45:13

LeetCode 693:交替位二进制数的位运算判断技巧

1. 题目到底在问什么:交替位二进制数的本质刚看到“交替位二进制数”这个题名,很多朋友第一反应是“又要写一个判断函数”,但真正动手之后才发现,这题考的是对二进制位模式的理解和位运算的基本功。LeetCode 693 的要求很简单&…

2026/9/7 15:45:13

Windows mklink命令实战:目录联接两行搞定数据同步与路径迁移

在日常工作中,我经常遇到这样的需求:代码仓库放在 D 盘开发目录,但某个工具只认 C 盘固定路径;或者笔记本的文档散落在多个磁盘,想统一汇总到网盘同步目录;又或者是重装系统后,想把旧的用户配置…

2026/9/7 15:45:13

深入解析MCP Transport层:从Stdio到HTTP的选型与排坑指南

1. MCP的Transport到底在解决什么问题先说结论:MCP的Transport层是整个协议的地基,它决定了你的MCP server怎么被找到、怎么被连接、怎么传数据、怎么处理断连。前面几篇笔记我分别梳理了MCP的协议模型、工具调用链路和资源体系,这篇专门把Tr…

2026/9/7 15:40:13

2026 上下文缓存进阶:把前缀契约写进SPEC,MonkeyCode 云端跑通

2026 上下文缓存进阶:别把整本手册每次都重算一遍 老赵 6 人小队给省级税务局做政策问答助手。客户口头说系统提示和口径手册每次都带上,回答要快,别让窗口再等。 他们把 18 页口径、角色说明、禁答清单整包塞进每一次请求。Qwen 每次都把前缀…

2026/9/7 0:47:43

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/7 0:14:19

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/7 0:14:17

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/7 0:03:36

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目:基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念,但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测,PyQt5 负责提供可视化的桌面交互界…

2026/9/7 0:03:36

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

简介:UL 1642是锂电池安全领域的重要规范,本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读,用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件,压缩包大小834KB,便…

2026/9/7 0:03:36

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

简介:BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本,由BSI标准出版,重点规定游乐设施和游乐设备在设计与制造环节的安全准则,与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

2026/9/6 11:40:10

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/6 19:33:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…