在 React 中更新 d3 元素?

2024-01-01

我正在尝试根据输入栏中的搜索输入更新此气泡图。现在,我将所有 d3 代码放入 Bubble.js 中,然后在 app.js 中,我有一个 searchinput 元素,它将过滤要显示的数据,然后在 Bubble 的状态中,我将其数据设置为等于过滤后的数据(名为 RoadmapData)。但是,我的气泡图没有更新。实际上,每次我输入内容时,都会呈现另一个气泡图,因此如果我输入 3 个字母,则会出现三个相同且未经过滤的气泡图.

这是我现在的代码:

import React, { Component } from "react";
import * as d3 from "d3";

class Bubble extends Component {
  constructor(props) {
    super(props);
    this.state = {
      dataset: { children: this.props.RoadmapData }
    };
  }

  componentWillReceiveProps(nextProps) {
    var diameter = 600;
var color = d3.scaleOrdinal(d3.schemeCategory10);

var bubble = d3
  .pack(this.state.dataset)
  .size([diameter, diameter])
  .padding(1.5);

var svg = d3
  .select("body")
  .append("svg")
  .attr("width", diameter)
  .attr("height", diameter)
  .attr("class", "bubble");

var nodes = d3.hierarchy(this.state.dataset).sum(function(d) {
  return d.Count;
});

var node = svg
  .selectAll(".node")
  .data(bubble(nodes).descendants())
  .enter()
  .filter(function(d) {
    return !d.children;
  })
  .append("g")
  .attr("class", "node")
  .attr("transform", function(d) {
    return "translate(" + d.x + "," + d.y + ")";
  });
node.append("title").text(function(d) {
  return d.Name + ": " + d.Count;
});

node
  .append("circle")
  .attr("r", function(d) {
    return d.r;
  })
  .style("fill", function(d, i) {
    return color(i);
  });

node
  .append("text")
  .attr("dy", ".2em")
  .style("text-anchor", "middle")
  .text(function(d) {
    return d.data.Name.substring(0, d.r / 3);
  })
  .attr("font-family", "sans-serif")
  .attr("font-size", function(d) {
    return d.r / 5;
  })
  .attr("fill", "white");

node
  .append("text")
  .attr("dy", "1.3em")
  .style("text-anchor", "middle")
  .text(function(d) {
    return d.data.Count;
  })
  .attr("font-family", "Gill Sans", "Gill Sans MT")
  .attr("font-size", function(d) {
    return d.r / 5;
  })
  .attr("fill", "white");
  }

  render() {
return <div>{this.node}</div>;
  }
}

export default Bubble;

我是 d3 的初学者,但我觉得问题要么是我使用了错误的生命周期方法(我在这里使用了 componentWillReceiveProps,当我使用 componentMount() 并在搜索栏中输入时,没有任何改变。或者也许我不应该返回 this.node? 提前致谢。


发生的情况是,每次重新渲染组件时,componentWillReceiveProps函数正在创建可视化的新实例并将其添加到<div>由 React 创建的节点,通过调用node.append。您可以通过删除以前创建的实例来避免这种情况d3 remove()功能 https://github.com/d3/d3-selection/blob/master/README.md#selection_remove.

如果你愿意介绍另一个库,有一个叫做反应仿 Dom https://github.com/Olical/react-faux-dom这将允许你避免所有 React 生命周期的事情,只需要在render()功能正常。它可能会稍微简化事情。

您还提到图表每次都未经过滤 - 这是因为您只将 data 属性分配给state在构造函数中 - 仅在首次创建组件时运行一次。在这种情况下,看起来您可以安全地删除它并从中读取数据this.props.RoadmapData每次(您似乎没有对组件内部的状态进行任何更改)。

你只需要在开头添加一行render()将数据转换为 d3 的正确格式,例如:

var roadmapDataForD3 = { children: this.props.RoadmapData };

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 React 中更新 d3 元素? 的相关文章

随机推荐

  • Resteasy 错误响应主体无法访问

    我正在使用 Quarkus 框架和 RestEasy 进行 REST 通信 当响应代码为 200 等时 一切正常 当客户端收到错误代码时 例如400 Bad Request Resteasy 返回 WebApplicationExcepti
  • 使用 N 路合并的时间复杂度

    我正在研究 2 路合并排序算法 并思考是否通过减少合并次数我们可以在时间方面获得更好的收益 例如 在 2 路合并中 我们有以下递归 T n 2T n 2 O n 时间复杂度为 N log base 2 N 如果我将问题除以 4 并合并 4
  • Go - 附加到结构上的切片不会持久[重复]

    这个问题在这里已经有答案了 我很难理解看似非常基本的操作 我想创建两个结构 其中一个结构将保存另一个结构的一部分 这是一个简单的例子来说明问题 Post structure type Post struct User string bson
  • 电子错误 AVDCreateGPUAccelerator:加载 GPU 渲染器时出错

    我正在尝试我的第一个电子应用程序 有谁知道为什么我收到此错误AVDCreateGPUAccelerator Error loading GPU renderer当我这样做时在终端npm start 目前看来还没有什么效果 我从安装一开始就使
  • 是否可以轻松地降低 ggplot 的饱和度?

    是否可以去饱和ggplot容易地 原则上 可能有两种可能的策略 首先 将一些函数应用于ggplot对象 或者 可能 Grob对象 来降低所有颜色的饱和度 二 打印的一些技巧ggplot渲染时降低饱和度 rmd文件 这两种策略对我来说都可以
  • 将字符串转换为 xsl 中的节点列表

    我目前有一个字符串 XSLT 1 0 我想将其转换为 NodeList 以便可以在以下示例中使用它 testString 表示 XML 树中的一个元素
  • Django 测试运行程序在 Ubuntu 上的 virtualenv 中失败

    我一直在努力解决 Ubuntu 14 04 上的 Python virtualenv 中安装的 Django 测试运行程序的问题 同样的软件在 MacOS 上运行良好 我认为在早期版本的 Ubuntu 上也运行良好 失败消息是 Import
  • utf-8 字符和 apache2 重写规则的问题

    我看到帖子了验证 htaccess 重写规则中的 utf 8 https stackoverflow com questions 2565864 validating utf 8 in htaccess rewrite rule我认为这很好
  • 使用 Asp.Net 主题时如何强制浏览器重新加载缓存的 CSS 文件? [复制]

    这个问题在这里已经有答案了 可能的重复 App Theme 文件夹中的 CSS 被缓存在浏览器中 https stackoverflow com questions 4517281 css in app theme folder gets
  • Discord.py 中的延迟命令

    我查看了很多地方 但找不到使用 ping 延迟 命令的方法discord py 像这样 client command pass context True async def pong ctx Somehow find pingtime aw
  • ASP.Net,母版页:每页样式表

    这些是我的假设 这些正确吗 使用 CSS 进行布局优于 使用表格 CSS 应提取到单独的文件中 而不是内联 CSS 是从 site master 中导入 链接 的 因此所有 css 都会导入 并应用于 所有 aspx 页面 鉴于此 我有一个
  • 在 data.frame 的列中填充字符串

    我有一个data frame X 有一个列A洋溢着chr 其中大部分属于nchar 5 但有些是nchar 4 我想放一个0在那些人面前 我会用以下伪代码来做到这一点 foreach element of X A as a this lin
  • jsPDF html 方法使用 addPage 在生成的 PDF 中分割页面

    我在用jsPDF s html为某些由多个段落组成的 html 生成 PDF 的方法p与每个p包含 50 500 个单词 PDF 是使用我定义的样式正确生成的 我面临的唯一问题是当内容p标签溢出到 PDF 中的新页面 剪切部分文本 如下所示
  • 如何使用sendinput函数C++

    尽管我从msdn看到了sendinput函数 但我不知道输入了什么参数 UINT WINAPI SendInput In UINT nInputs In LPINPUT pInputs In int cbSize 上面的参数是什么意思以及我
  • 使用 T-SQL 生成随机字符串

    如果您想使用 T SQL 生成伪随机字母数字字符串 您会怎么做 如何从其中排除美元符号 破折号和斜杠等字符 使用指南 SELECT randomString CONVERT varchar 255 NEWID 很短
  • 在 RSpec 测试中“let”真正节省了多少时间?

    我发现在代码中设置变量比使用变量容易得多let let很挑剔 总是告诉我错误使用的方式 当我在规范中使用简单的变量声明时 例如 tx good makeTransaction1 一切正常 但是当我使用let像这样 let tx good m
  • Django,级联移动到单独的表而不是级联删除

    我想在我们使用时保留数据delete 代替soft delete 使用 is deleted 字段 我想将数据移动到另一个表 对于已删除的行 https stackoverflow com a 26125927 433570 https s
  • 结果文档中生成空/空白命名空间声明

    我编写了一个用于将 XML 转换为 ePub 的包 一切正常 除了某些情况下 空白命名空间 xmlns 节点被写入结果文档 在转换之前 我准备了临时变量来保存主要段 即 meta body等 最后复制节点 使用xsl copy of cop
  • 为什么我们需要杰克逊数据绑定?

    我是 Spring MVC 的新手 我的问题是 为什么我们需要 jackson databind 因为我们可以收到Request Params by ModelAttribute并通过 http PUT 或 POST 请求 RequestB
  • 在 React 中更新 d3 元素?

    我正在尝试根据输入栏中的搜索输入更新此气泡图 现在 我将所有 d3 代码放入 Bubble js 中 然后在 app js 中 我有一个 searchinput 元素 它将过滤要显示的数据 然后在 Bubble 的状态中 我将其数据设置为等