Как создать компонент значка для пользовательских компонентов? - PullRequest
0 голосов
/ 16 июня 2020

Я столкнулся с очень неприятной проблемой: мне нужно создать компонент-значок, который будет размещен поверх пользовательского компонента.

Это моя первая попытка создать что-то подобное в React с HTML намного проще, потому что вы работаете напрямую с DOM.

В этом случае вместо этого мне нужно создать значок, который будет выделять новый компонент / функцию, когда вы нажимаете на него, открывается всплывающее окно с небольшим текст, который объясняет, что это за компонент, или его функциональность. Говорю вам об этом, потому что мне нужно прослушивать onClick, и невозможно использовать псевдоэлементы.

Основная идея

<BadgeComponent position="top left">
    <CustomComponent />
</BadgeComponent>

Поскольку я не могу использовать псевдоэлементы который унаследует все свойства элемента CSS, я так думаю:

  • не меняйте CustomComponent, потому что каждый раз может быть другим
  • BadgeComponent - это оболочка, которая создает div с position:relative (чтобы я мог разместить значок где угодно)
  • BadgeComponent должен быть display: inline-block, иначе это изменит общий макет
  • Мне нужно взять свойства коробочной модели CustomComponent, удалить из них и применить их к BadgeComponent. Это в основном потому, что margin s возятся с размером BadgeComponent, и расположение самого значка будет сложнее

В основном мне нужно взять свойства CSS элемента DOM, отображаемого из дочернего элемента компонент.

Подход

Итак, я экспериментировал с кодом до того, как пришел сюда, и моя первая попытка заключалась в том, чтобы динамически передать ref дочернему элементу компонент BadgeComponent с помощью этого фрагмента:

{React.Children.map(this.props.children, (element, idx) => {
    if (idx > 0) return; // don't care if it has more childrens, at least for now.
    return React.cloneElement(element, { ref: this.newFeature });
})}

Я также думал взять CustomComponent как опору BadgeComponent, например:

<BadgeComponent position="top left" target={ CustomComponent }>

Но я не Я (пока) не пошел по этому пути, потому что я думал, что в конце дня this.props.target это в основном то же самое, что и this.props.children, и на этом ничего не заработал. Я прав?

Я знаю, что в React у нас есть ref, чтобы получить ссылку на DOM, созданную из компонента, но в этом случае это не применимо, потому что я не применяю ref к компоненту который отображает HTML, я применяю его к CustomComponent, который клонируется и не передается в DOM.

Из моего эксперимента все работает нормально, если я передаю элемент HTML в экспериментальный код У меня есть div.box, который получает значок в нужном мне положении, но как только я передаю Button, я получаю следующую ошибку: Window.getComputedStyle: Argument 1 does not implement interface Element.

Я использую window.getComputedStyle, чтобы получить CSS свойства, которые мне небезразличны.

Мои исследования

Я искал в Интернете и увидел хороших реализация , которая, к сожалению, работает только со стилизованными компонентами или со стилями, определенными встроенными в <style>. Я не хочу использовать пакеты NPM как этот , потому что, во-первых, я считаю, что его можно реализовать без доступа к дополнительному пакету, а во-вторых, мне не очень нравится способ, которым липкий / значок get (при всем уважении, очевидно).

Я больше не знаю, где искать, я не являюсь опытным разработчиком JS / React (был разработчиком тем WP в течение 10 лет), так что, вероятно, есть некоторые основы c концепцию, которую я не понимаю?

Я читал о findDOMNode (внешний вид скоро будет устаревать) и forwardRef в экосистеме React, но я не думаю, что это способ go, я Я ошибаюсь?

Мне не нужен код копирования / вставки, хорошо, если вы так осторожны, чтобы разветвить codeandbox и поделиться решением, будет здорово, но я пытаюсь здесь научиться: есть способ получить ссылку на визуализированный элемент HTML из любого компонента?

Думая, что это недостающая часть, если я смогу добраться до DOM, мой код уже работает ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...