Как получить элемент реакции из event.target

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

Мне нужно отложить рендеринг item.component до появления nonSyntheticEvent

const items = [
  {
    name: "click me",
    component: function First() {
      return <strong>asd</strong>;
    }
  },
  {
    name: "click me 2",
    component: function Second() {
      return <b>oasd</b>;
    }
  }
];

class Component extends React.Component {
  componentDidMount() {
    this.el.addEventListener("nonSyntheticEvent", event =>
      this.nonSyntheticEventHandler(event)
    );
  }

  nonSyntheticEventHandler(event) {

    // how to get reference to item
    // from event.target to render it's item.component

    const el = React.createElement(item.component);
    ReactDOM.render(el, event.target);
  }

  render() {
    return (
      <div ref = {ref => { this.el = ref; }}>
        {this.props.items.map(item => <Child {...item} />)}
      </div>
    );
  }
}

<Component items = {items} />

Может быть, вы могли бы попробовать добавить обратную ссылку в функцию ref? ref = {ref => { this.el = ref; ref.reactComponent = this }}. Хотя кажется очень хакерским.

Håken Lid 02.09.2018 09:15

Это должно быть обработано с помощью ссылок, не обязательно, как было предложено выше, но каким-то образом. В чем конкретно ваш случай? Что это за событие и почему нужно заменить div собственным дочерним элементом? В зависимости от того, как должен выглядеть результат, могут быть гораздо менее сложные способы добиться того же.

Estus Flask 02.09.2018 22:05

Это событие Выбрать, родное для приложений Apple TV TVML, и документ не будет заменен его дочерним элементом, я пытался упростить вопрос

Teneff 03.09.2018 12:13
Поведение ключевого слова "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) для оценки ваших знаний,...
1
3
5 228
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В React 16.3 представлен React.createRef(), который можно использовать в Component для создания ссылки перед рендерингом компонента Child.

например, в Component.constructor ссылка на каждого потомка может быть создана в состоянии

this.state = {
  items: items.map(item => ({
    ...item,
    reference: React.createRef()
  }))
};

а затем в дочернем компоненте можно использовать props:

function Child(props){
  return (
    <div ref = {props.reference}>
      <span>{props.name}</span>
    </div>
  );
}

а потом в nonSyntheticEventHandler элемент можно получить так:

const found = this.state.items.find(item => {
  return item.reference.current === event.target;
});

рабочий пример в Codesandbox.io

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