React: d3.event рдПрдХ ReactJS + d3JS рдШрдЯрдХ рдореЗрдВ рд░рд┐рдХреНрдд рд╣реИ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 28 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: facebook/react

рдореИрдВ рдПрдХ рд╕рдВрдЧрдарди рдЪрд╛рд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП ReactJS, d3JS рдФрд░ ES6 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдореИрдВ рдЪрд╛рд░реНрдЯ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ рдФрд░ рдЗрд╕реЗ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЪрд╛рд░реНрдЯ рдореЗрдВ рдЬрд╝реВрдо рдФрд░ рдбреНрд░реИрдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ d3.behavior.zoom рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЬрд╝реВрдо рдХреА рдЧрдИ рд╡рд┐рдзрд┐ рдХрд╣рд▓рд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди d3.event рд╢реВрдиреНрдп рд╣реИред

рдореИрдВрдиреЗ рдЬрд╝реВрдо рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ div, svg рдФрд░ g рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЬрд╝реВрдо рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдШрдЯрдирд╛ рд╢реВрдиреНрдп рд╣реИред

рдореЗрд░реЗ ASP.NET рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдореИрдВрдиреЗ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ systemJS рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЕрд▓рд╛рд╡рд╛ d3.js рдХрд╛ рдХреЛрдИ рд╕рдВрджрд░реНрдн рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрд┐ d3.event рд╢реВрдиреНрдп рдХреНрдпреЛрдВ рд╣реИ, рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╕рдорд╕реНрдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдХрдИ рд╕реНрдЯреИрдХрдУрд╡рд░рдлрд╝реНрд▓реЛ рдЙрддреНрддрд░ рд╣реИрдВред

рдореЗрд░рд╛ рдХреЛрдб рдЗрд╕ https://github.com/Swizec/candidate-bucket-chart/blob/169779e110c8825f4545c71ae5845ff7bad4f1f4/src/BubbleChart.jsx рдЬреИрд╕реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реИ рдЬреЛ ReactJS рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рдореЗрд░рд╛ рд╕рд┐рд╕реНрдЯрдордЬреЗрдПрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИ:

<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;

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдк рдмреИрдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдпрд╛рдд/рдирд┐рд░реНрдпрд╛рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 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 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕рдВрджрд░реНрднрд┐рдд рдХреЛрдб рд╕рд╛рдорд╛рдиреНрдп d3 рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рдИрд╡реЗрдВрдЯ рд░рд┐рдПрдХреНрдЯ рдХреЗ рдИрд╡реЗрдВрдЯ рд╕рд┐рд╕реНрдЯрдо рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░рддрд╛ рд╣реИред рдпрд╣ рдПрдХ d3 рдкреНрд░рд╢реНрди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдХрд╛рд░рдг рд╕реЗ, рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВред

рдПрдХ рдФрд░ рдиреЛрдЯ рдкрд░, рдЖрдкрдХреЛ рдПрдХ рдбреЛрдо рдиреЛрдб рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ref рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рдЪрдпрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред d3.select("#viewport") рдЬреИрд╕реА рдЪреАрдЬрд╝реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░рдСрдкрд░реЗрдмрд┐рд▓рд┐рдЯреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ рдЬреЛ рдПрдХ рд╣реА рдЖрдИрдбреА рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрддреА рд╣реИрдВ, рдФрд░ рдПрдХ рдШрдЯрдХ рдХреЛ рдПрдХ рд╣реА рдкреГрд╖реНрда рдкрд░ рдХрдИ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╕реЗ рд░реЛрдХрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред ref рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЗрди рдореБрджреНрджреЛрдВ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдЗрд╕ рдореБрджреНрджреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рд▓реЛрдЧ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣рд╛рдВ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рдпрд╣рд╛рдВ рдПрдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ рдЬреЛ рдореЗрд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

  1. (рдХреНрд░реЛрдо) рдбреАрдмрдЧрд░ рдХреЗ рд╕реНрд░реЛрдд рдлрд▓рдХ рдЦреЛрд▓реЗрдВ
  2. рд╕рдорд╕реНрдпрд╛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдИрд╡реЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдИрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдмреНрд░реЗрдХрдкреНрд╡рд╛рдЗрдВрдЯ рд╕реЗрдЯ рдХрд░реЗрдВ
  3. рд╕рдорд╕реНрдпрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рдПрдВ
  4. рдирд┐рд╖реНрдкрд╛рджрди рдбреАрдмрдЧ рдореЗрдВ рдЯреВрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рддрдХ рдЖрдк d3 (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ d3_selection_onListener (рд╢реНрд░реЛрддрд╛, рддрд░реНрдХ) рдореЗрдВ рди рд╣реЛрдВ, рддрдм рддрдХ рдЖрдЧреЗ рдмрдврд╝реЗрдВред
  5. рдХрдВрд╕реЛрд▓ рдореЗрдВ рджрд░реНрдЬ рдХрд░реЗрдВ рдФрд░ d3 рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП рд╡реИрд╢реНрд╡рд┐рдХ рд╕рдВрджрд░реНрдн рд╕рд╣реЗрдЬреЗрдВ:

> window.theD3versionHostingTheEvent = d3;

  1. listener.apply(this, argumentz); рддрдХ рдЖрдЧреЗ рдмрдврд╝реЗрдВ рдФрд░ рддрдм рддрдХ рд╕реНрдЯреЗрдк рдЗрди рдиреЗрдХреНрд╕реНрдЯ рдлрдВрдХреНрд╢рди рдХреЙрд▓ рдЪреБрдиреЗрдВ рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдПрд░рд░ рдлреЗрдВрдХрдиреЗ рд╡рд╛рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдЬрд╛рддреЗред
  2. рдХрдВрд╕реЛрд▓ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рддреЛрдбрд╝реЗрдВ, рдФрд░ рдХрд░реЗрдВ: window.theD3versionHostingTheEvent == d3

рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо false , рддреЛ рдЖрдк рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ d3 рдХреЗ рджреЛ рдЙрджрд╛рд╣рд░рдг рдЪрд▓рд╛ рд░рд╣реЗ рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЙрди рдХрд╛рдореЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд┐рдХрд▓рд╛ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬрд┐рд╕рдореЗрдВ d3 рдмрдВрдбрд▓ рдерд╛ред

рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдЖрдк рдмреИрдмреЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рдЖрдпрд╛рдд/рдирд┐рд░реНрдпрд╛рдд рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ 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 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

zpao picture zpao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jvorcak picture jvorcak  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jimfb picture jimfb  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

vignestion picture vignestion  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

MoOx picture MoOx  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ