javascript - D3 和​​更新多维数组的元素

标签 javascript d3.js rxjs frp

假设我有一个名为 state 的二维数组,它看起来像 [[0,1,0],[1,1,0],[1,2,1] ]。这个数组的成员是不断更新的。我使用以下代码让 D3 成功渲染了数组的每个成员:

function view(state)
  const vis = d3.select('body')
                .selectAll('div')
                .data(state)
                .enter()
                  .append('div')
                  .attr('style', 'display: flex')
                  .selectAll('span')
                  .data((d,i) => d)
                  .enter()
                    .append('span')
                    .text(d => d)
  return vis
}

现在考虑一下每次我的state发生变化时都会调用这个view函数。如何让 D3 只重新渲染自上次渲染以来已更改的元素?目前,页面最初会呈现,但 D3 永远不会重新呈现任何元素,尽管在每次状态更改时都会调用 view 函数。

如果您想查看完整的源代码,我已将其发布 here

最佳答案

是的,要处理这种情况,您需要使用 enter 您正在执行的操作来创建新元素,并使用 exit 删除任何元素元素不在当前数组中。

我建议您这样做:

function view(state)
  var visData = d3.select('body')
                .selectAll('div')
                .data(state, function(d){/*uniquely identify each element in array*/return d;});

  const vis =  visData.enter()
                  .append('div')
                  .attr('style', 'display: flex')
                  .selectAll('span')
                  .data((d,i) => d)
                  .enter()
                    .append('span')
                    .text(d => d);
  //remove the unnecessary data divs.
  visData.exit().remove();

  return vis
}

进一步进入退出 read

关于javascript - D3 和​​更新多维数组的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34892783/

相关文章:

javascript - 使用 Javascript 在纸张上进行标记检测

javascript - 可以将事件添加到 d3 调度程序吗?

angular - 不能使用 Observable 作为 MatTable 的 DataSource,显示为空

javascript - 在 Angular 中链接可观察订阅的最佳方式?

javascript - 不要使用publishReplay缓存错误

javascript - jquery setTimeout 太多递归

javascript - 如何在不影响内部 anchor 的情况下使 li 可点击?

javascript - 更新嵌套数组 - React Native

javascript - d3.js - 如何风格化饼图

javascript - 使用 D3 为 svg 填充背景图像