Dies ist eine offene Frage, aber ich frage mich, ob es möglich ist, Vanille/regelmäßige JS D3 mit React-Komponenten zu kombinieren. Ich habe ein paar React-meets-D3-Tutorials gelesen, aber D3 in React-Komponenten zu bauen, klickt aus irgendeinem Grund einfach nicht mit meinem Gehirn. Es gibt großartige Ressourcen zum Erlernen von Vanille D3, also frage ich mich, ob es möglich ist, D3-Charts in React-Komponenten zu injizieren, während ich immer noch die Daten in meinem Redux-Store ausnutze?Ist es möglich, Standard D3 mit React-Komponenten (und ein Spritzer Redux) zu verwenden?
1
A
Antwort
3
Das Problem mit D3 ist es, das DOM für normales Arbeiten zu ändern.
Hier ist eine gute article with workaround for this problem. Es ist eine etwas unordentliche Lösung, aber am Ende erhalten Sie Komponenten, die gut mit reagieren und Sie können nativen D3-Code in ihnen schreiben. Die Schlüsselidee ist:
React Handle Eingabe und Verlassen der Elemente, und D3 behandeln Aktualisierung der Attribute .
Als Beispiel betrachten wir diese (sehr einfach) Bereich Grafik, die ich in meinem Projekt bin mit:
const d3Visualization = {
enter(data) {
const width = this.props.width;
const height = this.props.height;
const x = d3.time.scale.utc().range([0, width]);
const y = d3.scale.linear().range([height, 0]);
const xAxis = d3.svg.axis()./* ... axis code */
const yAxis = d3.svg.axis()./* ... axis code */
const area = d3.svg.area()
.x(d => x(new Date(d.dateTime)))
.y0(height)
.y1(d => y(d.usage));
x.domain(d3.extent(data, d => new Date(d.dateTime)));
y.domain([0, d3.max(data, d => d.usage)]);
this.d3Path
.datum(data)
.transition(100)
.attr("d", area);
this.d3XAxis
.attr("transform", "translate(0," + height + ")")
.call(xAxis);
this.d3YAxis
.call(yAxis)
}
};
class Area extends React.Component {
componentDidMount() {
this.d3Node = d3.select(ReactDOM.findDOMNode(this));
this.d3Path = this.d3Node.select("path.area");
this.d3XAxis = this.d3Node.select("g.x.axis");
this.d3YAxis = this.d3Node.select("g.y.axis");
}
componentDidUpdate() {
d3Visualization.enter.call(this, this.props.data)
}
render() {
return (
<svg width={this.props.width} height={this.props.height}>
<g transform="translate(20,10)">
<path className="area"/>
<g className="x axis"></g>
<g className="y axis">
<text></text>
</g>
</g>
</svg>
);
}
}
ich den Code so weit wie möglich vereinfacht haben nur kleine Demo nach links. Im obigen Artikel finden Sie eine Beschreibung der häufigsten Probleme und eine kompliziertere Demo-Komponente.
Verwandte Themen
- 1. Ist es möglich, Standard-Netzwerkanmeldeinformationen mit Mailkit und Exchange zu verwenden?
- 2. Ist d3 Kantenbeschriftung möglich?
- 3. Ist es möglich, eine `constexpr'-Vorlagevariable als Standard für ein formales Vorlagenargument zu verwenden
- 4. Ist es möglich, Svg Shapes in d3.js zu importieren?
- 5. Ist es möglich, Inline-Vorlagen zu verwenden?
- 6. Ist es möglich, Reflexion mit LINQ zu Entität zu verwenden?
- 7. Ist es möglich, Windows Standard-Verknüpfung zu ändern Funktionen
- 8. ist es möglich, TypeScript und Babel zusammen zu verwenden
- 9. Ist es möglich, ein Icon zu verschieben?
- 10. D3: Ist es möglich, + eine Achse zu zoomen und nur die andere zu schwenken?
- 11. Ist es möglich, Bindungen mit Anmerkungen zu verwenden?
- 12. ist es möglich, ExtJS mit backbone.js zu verwenden?
- 13. Ist es möglich, ein Einlaufen zu erkennen?
- 14. Ist es möglich, SQLite.NET mit unveränderlichen Datensatztypen zu verwenden?
- 15. Ist es möglich, Flashvars mit JBoss zu verwenden?
- 16. Ist es möglich, Mootools und jQuery beide zusammen zu verwenden
- 17. Ist es möglich reCAPTCHA ohne iframe und Javascript zu verwenden?
- 18. Ist es möglich, Polymer und Brick zusammen zu verwenden?
- 19. Ist es möglich, slideUp() zu verwenden und vor()
- 20. Ist es möglich, .NET Reactor mit ClickOnce-Bereitstellung zu verwenden?
- 21. Ist es möglich, benutzerdefinierte EventArgs mit SystemEvents zu verwenden?
- 22. Ist es möglich, Skydrive mit SVN zu verwenden?
- 23. Ist es möglich, mit youtube-api modelbranding zu verwenden?
- 24. Ist es möglich, ein Pseudozufall zu teilen
- 25. Ist es möglich, Freiformformen als Fenster in OSX zu verwenden?
- 26. Ist es möglich, Django mit Qooxdoo Framework zu verwenden?
- 27. Ist es möglich, Python mit PHP zu verwenden
- 28. Ist es möglich, Riak CS mit Apache Flink zu verwenden?
- 29. Ist es möglich, mongodb mit sqlalchemy zu verwenden?
- 30. Ist es möglich, jQuery intellisense mit klassischem Asp zu verwenden?
Hier ist ein Beispiel: https://github.com/EcutDavid/D3In20Days d3 mit reagieren. –