React: d3.event ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ ReactJS + d3JS

Π‘ΠΎΠ·Π΄Π°Π½Π½Ρ‹ΠΉ Π½Π° 28 Π°ΠΏΡ€. 2016  Β·  3ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ  Β·  Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: facebook/react

Π― ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽ ReactJS, d3JS ΠΈ ES6 для создания ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡ‹. Π― ΠΌΠΎΠ³Ρƒ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ ΠΈ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΅Π΅. Но я Ρ…ΠΎΡ‡Ρƒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΈ пСрСтаскивания, поэтому я использовал d3.behavior.zoom . Π― ΠΌΠΎΠ³Ρƒ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ , ΠΌΠ΅Ρ‚ΠΎΠ΄ Π£Π²Π΅Π»ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ называСтся, Π½ΠΎ d3.event Ρ€Π°Π²Π½ΠΎ Π½ΡƒΠ»ΡŽ.

Π― попытался ΠΏΡ€ΠΈΠ²ΡΠ·Π°Ρ‚ΡŒ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ ΠΊ div, svg ΠΈ g, Π½ΠΎ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ‚. ВызываСтся ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π½ΠΎ событиС ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ NULL.

Π’ ΠΌΠΎΠ΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ ASP.NET я убСдился, Ρ‡Ρ‚ΠΎ Ρƒ мСня Π½Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ссылок Π½Π° d3.js, ΠΊΡ€ΠΎΠΌΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ systemJS, которая Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΎΡ‚Π²Π΅Ρ‚Π°Ρ… stackoverflow упоминаСтся ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, связанная с Ρ‚Π΅ΠΌ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ d3.event ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ null.

Мой ΠΊΠΎΠ΄ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΡ…ΠΎΠΆ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ этому https://github.com/Swizec/candidate-bucket-chart/blob/169779e110c8825f4545c71ae5845ff7bad4f1f4/src/BubbleChart.jsx, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ΡΡ‚Π°Ρ€ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ReactJS.

Π­Ρ‚ΠΎ моя конфигурация systemJS:

<script>
    System.defaultJSExtensions = true;
    System.config({
        map: {
            'rx': "https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.7/rx.all.min.js",
            'react': 'https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react.js',
            'react-dom': 'https://cdnjs.cloudflare.com/ajax/libs/react/15.0.1/react-dom.js',
            'd3': 'https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.16/d3.js'
        }
    });
    System.import('../app/app.js');
</script>
import React, { Component } from 'react';
import * as Rx from 'rx';
import * as d3 from 'd3';
import Person from './person';

class OrgChart extends Component {

    constructor(props) {
        super(props);

        this.state = { persons: [] };
    }

    componentWillMount() {
        // Just read a JSON file
        var source = Rx.Observable.fromPromise($.getJSON("/js/org-persons.json"));

        source.subscribe(
            function(chart) {
                var tree = d3.layout.tree()
                    .nodeSize([110, 50])
                    .separation(function() {
                        return 1;
                    });

                var nodes = tree.nodes(chart[0]).reverse();

                var links = tree.links(nodes);

                var p = [];

                nodes.forEach(function(node) {
                    fs.push((<Person x={node.x} y={node.y}></Person>));
                }.bind(this));

                this.setState({ person: p });

            }.bind(this)
        );
    }

    componentDidMount() {
        var rootX = document.body.clientWidth / 4;
        var rootY = 300;

       // A standard setup with d3 to use it's zoom/drag behavior
        var zoom = d3.behavior.zoom()
            .scaleExtent([1, 10])
            .on("zoom", this.zoomed)
            .translate([rootX, rootY]);

       // Attach zoom behavior to the first group in the svg.
        d3.select("#viewport")
            .call(zoom);
    }

    // When I drag the svg, this function gets called but the event is null. d3 is a global object.
    zoomed() {
        d3.select("#viewport").attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
    }

   // renders an org chart
    render() {

        return (
            <div id='treeContainer'><svg id='fullTree' width='100%'>
                <g id='viewport'>
                    { this.state.persons }
                </g>
            </svg></div>
        );
    }
}

export default OrgChart;

Π‘Π°ΠΌΡ‹ΠΉ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

ΠžΡ‡Π΅Π½ΡŒ вСроятно, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Babel, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠΌ измСняСмого поля ΠΈΠ· d3 с использованиСм синтаксиса ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° / экспорта.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ это: https://github.com/d3/d3/issues/2733#issuecomment -190743489

Π’Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ способ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° d3 ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

import * as d3 from 'd3';
import {event as currentEvent} from 'd3';

И Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ всС вхоТдСния d3.event Π½Π° currentEvent .

Π­Ρ‚ΠΎ устраняСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с d3.js v3.

ВсС 3 ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ

Код, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΡΡΡ‹Π»Π°Π΅Ρ‚Π΅ΡΡŒ, являСтся ΠΎΠ±Ρ‰ΠΈΠΌ javascript d3, ΠΈ событиС Π½Π΅ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Ρ‡Π΅Ρ€Π΅Π· систСму событий React. Π­Ρ‚ΠΎ ΠΏΠΎΡ…ΠΎΠΆΠ΅ Π½Π° вопрос d3, Π½Π΅ связанный с React. По этой ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ я Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽ этот вопрос.

Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ref для ссылки Π½Π° ΡƒΠ·Π΅Π» DOM, НЕ выбирая ΠΏΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρƒ. ИспользованиС Ρ‚Π°ΠΊΠΈΡ… Π²Π΅Ρ‰Π΅ΠΉ, ΠΊΠ°ΠΊ d3.select("#viewport") ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ совмСстимости с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, ΠΈ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ использованиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π½Π° ΠΎΠ΄Π½ΠΎΠΉ ΠΈ Ρ‚ΠΎΠΉ ΠΆΠ΅ страницС. ИспользованиС ref Ρ€Π΅ΡˆΠΈΡ‚ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹.

Π”Ρ€ΡƒΠ³ΠΈΠ΅, Ρƒ ΠΊΠΎΠ³ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ»Π° эта ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, навСрняка окаТутся здСсь, поэтому Π²ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ сработал для мСня:

  1. ΠžΡ‚ΠΊΡ€ΠΎΠΉΡ‚Π΅ (Ρ…Ρ€ΠΎΠΌ) панСль источников ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ°
  2. УстановитС Ρ‚ΠΎΡ‡ΠΊΡƒ останова ΠΏΡ€ΠΎΡΠ»ΡƒΡˆΠΈΠ²Π°Ρ‚Π΅Π»Ρ событий для события, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ
  3. ВоссоздайтС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ
  4. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ Π² ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ. Π¨Π°Π³Π°ΠΉΡ‚Π΅ Π²ΠΏΠ΅Ρ€Π΅Π΄, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΎΠΊΠ°ΠΆΠ΅Ρ‚Π΅ΡΡŒ Π² d3 (особСнно d3_selection_onListener (listener, argumentz)).
  5. Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅ Π² консоль ΠΈ сохранитС Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ссылку Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ d3:

> window.theD3versionHostingTheEvent = d3;

  1. Π‘Π΄Π΅Π»Π°ΠΉΡ‚Π΅ шаг Π²ΠΏΠ΅Ρ€Π΅Π΄ Π΄ΠΎ listener.apply(this, argumentz); Π° Π·Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ Β« ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π²Ρ‹Π·ΠΎΠ²Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈΒ», ΠΏΠΎΠΊΠ° Π½Π΅ Π΄ΠΎΠ±Π΅Ρ€Π΅Ρ‚Π΅ΡΡŒ Π΄ΠΎ мСста,
  2. Π‘Π½ΠΎΠ²Π° Π²Π·Π»ΠΎΠΌΠ°ΠΉΡ‚Π΅ консоль ΠΈ сдСлайтС: window.theD3versionHostingTheEvent == d3

Если Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ false , Π²Ρ‹ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π΄Π²Π° экзСмпляра d3. Π’ ΠΌΠΎΠ΅ΠΌ случаС оказалось, Ρ‡Ρ‚ΠΎ Π² ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ я использовал, Π±Ρ‹Π» встроСн d3.

ΠžΡ‡Π΅Π½ΡŒ вСроятно, Ρ‡Ρ‚ΠΎ Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Babel, Ρƒ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠΌ измСняСмого поля ΠΈΠ· d3 с использованиСм синтаксиса ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° / экспорта.

Π‘ΠΌΠΎΡ‚Ρ€ΠΈΡ‚Π΅ это: https://github.com/d3/d3/issues/2733#issuecomment -190743489

Π’Ρ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ способ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π° d3 ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

import * as d3 from 'd3';
import {event as currentEvent} from 'd3';

И Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ всС вхоТдСния d3.event Π½Π° currentEvent .

Π­Ρ‚ΠΎ устраняСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с d3.js v3.

Π‘Ρ‹Π»Π° Π»ΠΈ эта страница ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ?
0 / 5 - 0 Ρ€Π΅ΠΉΡ‚ΠΈΠ½Π³ΠΈ