【发布时间】:2016-07-28 07:35:03
【问题描述】:
我将crossfilter.js 和d3.js v4 与ES6 风格的React 一起使用,以尝试使用上下文刷来制作维度图表。本质上,我采用了this example 并将其转换为 ES6。
我遇到的问题是selection.exit().remove() 无法正常工作,因此在每次重绘时,svg g 元素会附加越来越多的圆圈。创建画笔时会触发重绘。我通过运行检查了
selection.exit()
.attr('class', d => {
console.log('anything');
return 'anything';
})
.remove();
但没有输出任何内容,所以我认为我的数据选择无效。
这里是上下文:
componentDidMount() {
const el = ReactDOM.findDOMNode(this); // the mounted svg element
const svg = d3.select(el)
.attr('width', 300)
.attr('height', 500);
const g = svg.append('g')
.attr('transform', 'translate(32,32)');
let circles = g.append('g')
.selectAll('circle');
const brushGroup = g.append('g')
.attr('class', 'brush')
.call(brush);
function redraw() {
const all = group.all(); // crossfilter group returns an array
xAxisGroup.call(xAxis);
yAxisGroup.call(yAxis);
circles = circles.data(all, d => d); // keyFn for data constancy
circles.enter().append('circle')
.attr('r', radius)
.attr('cx', plotX) // radius + plotX/Y are simple curry functions
.attr('cy', plotY);
circles.exit().remove(); // not working!!
}
redraw();
}
我也知道 v4 中 d3-selection 的这一变化,但我不太确定哪些行是我的update,哪些行是我的update + enter。
任何帮助将不胜感激。谢谢!
【问题讨论】:
-
exit选择是,在将数据绑定到选择之后,所有那些没有数据引用它们的元素。现在仔细看看你的let circles:它们没有绑定任何数据。您必须正确定义输入、更新和退出选择。现在它们的定义不正确。 -
当我设置
circles = circles.data(all, d => d).. 时会怎样,这不会创建正确的连接选择因此circles.enter()和circles.exit()? -
您的圈子数据是否有唯一 ID,例如
circles = circles.data(all, d => d.id) -
@John,是的,确实如此:我是那个不仔细看的人,我读到了
circles.data,实际上是circles = circles.data。继续:尝试从圈子中删除append("g"),我的意思是,将其放在其他任何地方,而不是在let circles分配中。 -
@Gerardo 我尝试删除嵌套的
g,但没有帮助。我确实需要父g因为有兄弟gs.. DOM 结构看起来像svg --> g --> g, g, g, g
标签: javascript d3.js reactjs ecmascript-6 crossfilter