面向对象的D3 JS-如何选择对象?

大卫·费里斯(David Ferris)

设置我的D3项目,该项目在屏幕上具有许多要动画的形状(Org类)。我正在尝试维护一个面向对象的范例,并利用D3动画(https://jrue.github.io/coding/2014/lesson07/)。

考虑下面的代码:

function test() {

    class Org {
        constructor(_width, _height) {
            this.width = _width;
            this.height = _height;
        }
    }
    var orgs = [];
    var canvas = d3.select('body')
            .append('svg')
            .attr('width', screen.width)
            .attr('height', screen.height);

    for (var x = 0; x < 100; x++) {
        var circle = new Org(Math.random()*screen.width, Math.random()*screen.height);
        orgs.push(circle);
        canvas.append('circle')
            .attr('cx', circle.width)
            .attr('cy', circle.height)
            .attr('r', 5)
            .attr('fill', 'pink');
    }

    for (var b = 0; b < orgs.length; b++) {
        circle.transition().attr('cx', 0); //DOES NOT WORK
    }
}

显然,注释行引发错误,因为它transition()属于D3,而不是我的班级。如何选择这些对象并对它们进行动画处理?

高积云

您的代码不是D3- ish,这使得实现您的目标变得很麻烦。请记住,D3本质上是关于数据驱动的文档的,因此,数据绑定是其核心。了解这一概念对于充分利用该库至关重要。相应地重构代码时,解决方案几乎显而易见。

也就是说,在处理D3时,使用for循环总是看起来很可疑。很少需要使用这些循环,因为D3的内部工作可以解决这些问题。在不破坏OO方法的情况下,您可以将orgs数组绑定到选择区域,并利用D3的魔力:

var circles = canvas.selectAll("circle")
  .data(orgs)
  .enter().append('circle')
    .attr('cx', d => d.width )
    .attr('cy', d => d.height )
    .attr('r', 5)
    .attr('fill', 'pink');

这会将圆圈添加到您选择Orgorgs数组中,该圆圈对应于您数组中使用绑定到选择的所有实例.data(orgs)上面的语句还保留了对该选择的引用,该选择在circles变量中包含所有新添加的圆,您可以将其用于以后的操作。

进行过渡时,此参考资料会派上用场:

circles
  .transition()
    .attr('cx', 0);

请看以下与您的方法相同的代码段,但它是D3方式。

class Org {
  constructor(_width, _height) {
    this.width = _width;
    this.height = _height;
  }
}

var orgs = d3.range(100).map(function() {
  return new Org(Math.random() * screen.width, Math.random() * screen.height);
});

var canvas = d3.select('body')
  .append('svg')
  .attr('width', screen.width)
  .attr('height', screen.height);

var circles = canvas.selectAll("circle")
  .data(orgs)
  .enter().append('circle')
    .attr('cx', d => d.width )
    .attr('cy', d => d.height )
    .attr('r', 5)
    .attr('fill', 'pink');

circles
  .transition()
    .attr('cx', 0);
<script src="https://d3js.org/d3.v4.js"></script>


您可能需要看一些有关此概念的教程,以进行更深入的介绍:

  1. 三个小圆圈
  2. 让我们制作一个条形图,第一第二第三部分
  3. 用联接思考
  4. 选择的工作方式(高级)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Fabric JS中取消选择对象

来自分类Dev

Fabric JS右键单击选择对象

来自分类Dev

如何仅通过Fabric.js单击实际内容来选择对象

来自分类Dev

three.js-选择对象,获取对象材料

来自分类Dev

Fabric.js-如何在不释放鼠标键的情况下取消选择对象并选择组

来自分类Dev

如何通过子属性选择对象

来自分类Dev

如何指定/选择对象的特定属性

来自分类Dev

如何根据键值选择对象-VueJS

来自分类Dev

ThreeJS如何选择对象的交点颜色

来自分类Dev

如何按功能选择对象?

来自分类Dev

节点js中的面向对象编程

来自分类Dev

three.js旋转面向对象

来自分类Dev

随机选择对象

来自分类Dev

随机选择对象

来自分类Dev

选择对象

来自分类Dev

LINQ选择对象

来自分类Dev

选择对象JQuery

来自分类Dev

如何编写面向对象的Node.js模型

来自分类Dev

libGDX 3D跟随并面向对象

来自分类Dev

如何在JavaScript中获取随机选择对象的键?

来自分类Dev

如何遍历由选择对象创建的数组

来自分类Dev

如何使用选择对象从派生表中查询?

来自分类Dev

如何选择对象及其属性(基于linq列出的属性)?

来自分类Dev

如何根据子集合中的值选择对象?

来自分类Dev

如何在JSON中搜索和选择对象

来自分类Dev

如何使用变量通过键选择对象节点

来自分类Dev

Revit Python选择对象/选择对象

来自分类Dev

选择对象唯一

来自分类Dev

Powershell选择对象格式