React: يعد d3.event فارغًا في مكون ReactJS + d3JS

تم إنشاؤها على ٢٨ أبريل ٢٠١٦  ·  3تعليقات  ·  مصدر: facebook/react

أنا أستخدم ReactJS و d3JS و ES6 لإنشاء مخطط هيكلي. يمكنني إنشاء الرسم البياني ورؤيته. لكني أريد إضافة سلوك التكبير / التصغير والسحب إلى المخطط ، لذلك استخدمت d3.behavior.zoom . أستطيع أن أرى أن الطريقة التي تم تكبيرها تسمى ، لكن الحدث d3 . فارغ.

حاولت إرفاق سلوك التكبير / التصغير بـ div و svg و g ولكن لا شيء يساعد. يتم استدعاء سلوك التكبير ولكن الحدث فارغ.

في مشروع ASP.NET الخاص بي ، تأكدت من عدم وجود أي إشارة إلى d3.js بخلاف تكوين systemJS الذي ذكره العديد من إجابات stackoverflow على أنه المشكلة المتعلقة بكون d3.event فارغًا.

الكود الخاص بي مشابه جدًا لما هو موجود في مثال مثل هذا https://github.com/Swizec/candidate-bucket-chart/blob/169779e110c8825f4545c71ae5845ff7bad4f1f4/src/BubbleChart.jsx الذي يستخدم الإصدار القديم من ReactJS.

هذا هو تكوين نظام JS الخاص بي:

<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 كومينتر

يبدو أن الكود الذي تشير إليه هو جافا سكريبت d3 عام ، ولا يمر الحدث عبر نظام حدث React. يبدو هذا مثل سؤال d3 ، لا علاقة له بـ React. لهذا السبب ، سأغلق هذه المشكلة.

في ملاحظة أخرى ، يجب عليك استخدام ref للإشارة إلى عقدة DOM ، وليس التحديد بواسطة المعرف. يمكن أن يتسبب استخدام أشياء مثل d3.select("#viewport") حدوث مشكلات في التشغيل البيني مع المكونات الأخرى التي تحدث لاختيار نفس المعرف ، ومنع استخدام أحد المكونات عدة مرات على نفس الصفحة. سيؤدي استخدام ref إلى حل هذه المشكلات.

بالتأكيد سينتهي الأمر بالآخرين الذين يعانون من هذه المشكلة هنا ، لذا إليك نهج نجح معي:

  1. افتح جزء مصادر مصحح الأخطاء (الكروم)
  2. قم بتعيين نقطة توقف مستمع الحدث للحدث المسبب للمشكلة
  3. أعد إنشاء المشكلة
  4. يجب أن يقتحم التنفيذ التصحيح. تقدم للأمام حتى تصبح في d3 (خاصة d3_selection_onListener (listener ،umentsz)).
  5. أدخل إلى وحدة التحكم واحفظ مرجعًا عامًا لكائن d3:

> window.theD3versionHostingTheEvent = d3;

  1. تقدم للأمام حتى listener.apply(this, argumentz); ثم اختر الخطوة إلى استدعاء الوظيفة التالي حتى تصل إلى المكان الذي يظهر فيه الخطأ.
  2. اقتحم وحدة التحكم مرة أخرى ، وافعل: window.theD3versionHostingTheEvent == d3

إذا كانت النتيجة false ، فأنت بالتأكيد تشغل مثيلين من d3. في حالتي ، اتضح أن أحد libs الذي كنت أستخدمه يحتوي على 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 التقييمات