gpt4 book ai didi

javascript - 在 React 中更新 d3 元素?

转载 作者:行者123 更新时间:2023-11-29 18:45:49 25 4
gpt4 key购买 nike

我正在尝试根据我在输入栏中的搜索输入更新此气泡图。现在,我将所有 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() function 删除先前创建的实例来避免这种情况。 .

如果您愿意介绍另一个库,可以使用一个名为 React Faux Dom 的库这会让你避免所有 React 生命周期的事情,只做 render() 中的所有事情。功能正常。它可能会稍微简化一些事情。

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

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

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

关于javascript - 在 React 中更新 d3 元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54120318/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com