D3.event не работает при объединении модулей

У меня есть код, в котором я импортирую (инструкция es6 import) d3-selection и d3-transition. Однако мне также нужно захватить событие. Когда я не импортирую d3-переход, d3.events работает отлично. Как только я импортирую d3-transition, я получаю сообщение об ошибке, в котором говорится, что d3.event - это null и не может ссылаться на свойства события.

Есть примечание в Справочнике по API D3.

https://github.com/d3/d3-selection/blob/master/README.md#event: Если вы используете Babel, Webpack или другой сборщик ES6-to-ES5, имейте в виду, что значение d3.event изменяется во время события! Импорт d3.event должен быть живой привязкой, поэтому вам может потребоваться настроить сборщик для импорта из модулей ES6 D3, а не из сгенерированного пакета UMD; не все сборщики соблюдают jsnext: main. Также остерегайтесь конфликтов с глобальным window.event.

Я использую babel (для поддержки ie11) и webpack для сборки. Что означает эта записка? Почему не работает что-то вроде import {event as d3event} from'd3-selection';, за которым следует let d3 = Object.assign({}, d3selection, d3transition, d3event};?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
5
0
1 398
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
import {event as d3event} from'd3-selection'
d3event === null // true; `event`'s value changes later with user input.
let d3 = Object.assign({}, d3selection, d3transition, d3event)
// won't have an `event` property since Object.assign({}, null) -> {}

Добавление d3.event = event // or d3 = {event} по-прежнему будет возвращать нулевое событие, наблюдаемое во время назначения; см. Метод Майка Бостока для получения текущего события для решения.

Заметка о d3.event теперь содержит ссылка для объяснения того, что такое живое связывание: ссылка на переменную в d3-selection.

Дополнительное предостережение, которое стоило мне некоторого времени: если d3-drag указывает на другую версию d3-select, чем другие ваши инструменты, d3.select(/**/).call(d3.drag(/**/)) не будет работать, поскольку события никогда не достигают переменной event, которую использует d3.drag. Где-то в районе d3@^5 основной пакет больше не связывает версию d3-selection, что допускает такого рода несоответствия.

Другие вопросы по теме