【发布时间】:2021-03-02 11:30:57
【问题描述】:
我是 D3 的新手,我正在做一个简单的示例,试图了解数据绑定的工作原理。
基本上我有一个颜色数组、一个添加颜色的函数和一个从索引中删除颜色的函数。
不工作的是删除操作。
如果我将 0 设置为要删除的索引,我会看到 D3 将最后一个元素设置为要删除的元素。如果我使用密钥访问器d => d,它可以工作。
我有很多问题。
这是我的代码:
const data = {
colors: ["Black", "White", "Brown"],
addColor(color) {
this.colors.push(color);
},
removeColorByIndex(index) {
this.colors.splice(index, 1);
}
};
const root = d3.select("#root");
const barsContainer = d3.select("#bars-container");
const addButton = d3.select("#add-button");
const removeButton = d3.select("#remove-button");
addButton.on("click", () => {
const newColor = d3.select("#color-input").node().value;
data.addColor(newColor);
update();
});
removeButton.on("click", () => {
const index = d3.select("#index-input").node().value;
data.removeColorByIndex(index);
update();
});
function update() {
barsContainer
.selectAll("div")
.data(data.countries, (d, i) => {
console.log({ i, d });
return i;
})
.join(
(enter) => {
console.log("enter:", enter);
return enter
.append("div")
.text((d) => d)
.classed("bar", true)
.classed("added", true);
},
(update) => {
console.log("update:", update);
return update.classed("update", true);
},
(exit) => {
console.log("exit:", exit);
return exit.classed("remove", true);
}
);
console.log("divs", barsContainer.selectAll("div")["_groups"][0]);
}
update();
.bar {
margin: 5px 0px 5px 0px;
max-width: 200px;
padding: 10px;
}
.added { background-color: lightgreen; }
.update { background-color: cornflowerblue; }
.remove { background-color: tomato; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="root">
<div>
<div>
<input type="text" id="color-input" />
<button id="add-button">Add color</button>
</div>
<div>
<input type="text" id="index-input" />
<button id="remove-button">Remove color by index</button>
</div>
</div>
<div id="bars-container"></div>
</div>
- 最初所有的条都是绿色的。那是因为它们都在输入选择中。
- 如果我使用 UI 按钮添加颜色,则会出现新的条形图,它是绿色的,旧的条形图变成蓝色。
- 那么,如果我尝试删除索引为 0 的条,最后一个条变成红色,而不是第一个条,为什么?
如果我想象背后的逻辑,那将是:
| Step # | Action | Enter selection | Update selection | Exit selection | Join return selection (enter + update) |
|---|---|---|---|---|---|
| 0 | / | [black, white, brown] | [] | [] | black, white, brown |
| 1 | Add 'Yellow' color | [yellow] | black, white, brown] | [] | black, white, brown, yellow] ? |
| 2 | Remove element with index 0 | [] | [yellow] | [black] | [yellow] |
但是好像不对,我哪里错了?
我知道 data(myData, (d, i) => i) 与 data(myData) 相同,这意味着 D3 按索引匹配数据/DOM 节点。那么为什么如果我查看绑定元素的__data__ 属性,它们有__data__ = black/white/brown 而不是__data__ = 0/1/2?
我很困惑,我没有找到任何可以帮助我的东西..
我阅读了 D3 文档以及 this question。
【问题讨论】:
标签: javascript html d3.js