首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >D3(幕后)-area.style.append工作,而area.style + area.append不工作。为什么?

D3(幕后)-area.style.append工作,而area.style + area.append不工作。为什么?
EN

Stack Overflow用户
提问于 2020-04-07 03:07:07
回答 1查看 39关注 0票数 3

嗨,我有一个关于d3本质的问题,我认为这是关于d3的非常深入的细节。

据我所知,

d3中的变量声明,

代码语言:javascript
运行
复制
 var svg = d3.select('boby').append('svg')

意味着,

“我将选择'body‘并附加'svg’,并将其存储为一个名为‘svg’的变量。”

而不是

变量svg是‘选择主体并追加svg’

我认为这样做的原因是

如果第二个是右整数,

每次我输入svg时,它每次都会附加svg。

所以我认为我的第一个整数是对的。

然而,

如果是这样的话,下面的代码应该可以工作。

代码语言:javascript
运行
复制
var area = svg.append('g')

area.append('path')

area.attr('d').data(somedata)

因为,我加了“g”

并将其存储为称为“area”的变量。

然后在那里完成了“道路”

然后在那里添加属性

然后把一些数据联系起来。

但是,没能成功。

我试过的是,

删除另一个变量,并在该新变量之后添加附加条件,如

代码语言:javascript
运行
复制
var uarea = area.append('path')

uarea.attr('d').data(somedata)

结果很完美。

为什么我的第一种方法在最后一种方法起作用时不起作用。我认为这个问题更多的是关于在d3场景背后发生了什么。我希望有人能在d3上给我一些启发。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-07 04:56:57

我不确定我是否正确理解了你的问题。但我会在这里给出一个答案。

简短的回答是:不,您正在测试的假设是不正确的,因为它假设.append()修改了现有的选择。area仍然是一个g的选择,不管您在area中附加了什么。

我将从一开始就开始,因为您第一次假设附加SVG

D3选择方法通常是可链接的,因为它们经常用于返回选择。通过返回选择,可以对返回的值使用另一个选择方法,从而允许链接。

但是,由选择方法返回的选择并不总是相同元素的选择-也就是说,它可能是不同的选择。

如果使用.style().attr().each().call().on().raise().html().text()等方法设置属性、样式等,则返回的值是原始选择本身。通常可以用来返回当前选择的方法是那些修改有关选择的内容的方法。如果不设置值,可以使用这些方法中的许多来返回值而不是选择。

如果使用诸如.append().enter().exit().merge().filter().select().selectAll()等方法,则返回的值是不同的选择。

当使用链定义变量时,赋值是链中最后一个项的返回值。

最后,不能更改D3选择:

选择是不变的。所有影响所选元素(或它们的顺序)的选择方法都返回一个新的选择,而不是修改当前的选择。(来源)

一旦我们将一个选择定义为由某些元素组成,我们就不能改变它。我们只能用不同的选择重新定义变量。

D3v3在这方面略有不同,但不是为了你的问题。

现在,看看您对这一行的初步评估:

代码语言:javascript
运行
复制
var svg = d3.select('body').append('svg')

你的解释是:

我将选择'body‘并附加一个'svg’。并将其存储为一个名为svg的变量。

您的解释是正确的,让我们打破链接,使用两个变量来实现相同的事情,以查看您正在使用的两个选择:

代码语言:javascript
运行
复制
var body = d3.select("body") // returns a selection of the body
var svg = body.append("svg") // returns a selection of a newly created svg

body仍然是对身体的选择--附加到body中的东西并没有改变,body是身体的选择。然后使用svg存储新的选择:新附加的SVG的选择。以后向svg添加任何项都不会将svgsvg的选择中更改。

应用上述所有内容,我们可以看到一种方法,例如:

代码语言:javascript
运行
复制
var area = svg.append('g') // returns a selection of a new g element, stored as `area`

area.append('path')        // returns a selection of a new created path element, but you don't store this reference, nothing is done with it.

area.attr('d', somePathData) // attempting to modify a g element instead of a path.

这将不像您预期的那样工作,area仍然是一个g元素的选择:您将它定义为这样,并且没有将area重新定义为一些不同的选择。.append()创建了一个新的选择--除了创建路径之外,您不使用它。

正如您注意到的,如果我们将path选择存储在一个新变量中,代码将按预期工作:

代码语言:javascript
运行
复制
var area = svg.append('g') // returns a selection of a new g element

var path = area.append('path') // returns a selection of a new path element

path.attr('d', somePathData) // modifies a path element

最后,如果我们不再需要修改路径,就不需要使用变量来存储它,我们可以这样做:

代码语言:javascript
运行
复制
var area = svg.append('g') // returns a selection of a new g element

area.append('path') // returns a selection of a new path element
    .attr('d', somePathData) // modifies the selection of the path element
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61072182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档