Получение DOM node из дочернего элемента React

Используя метод React.findDOMNode, который был введен в v0.13.0, я могу получить DOM node каждого дочернего компонента, который был передан в родительский объект, путем сопоставления над this.props.children.

Однако, если некоторые из дочерних элементов являются элементами React, а не компонентами (например, один из дочерних элементов - это <div>, созданный с помощью JSX). React вызывает ошибку нарушения инварианта.

Есть ли способ получить правильный DOM node каждого ребенка после монтирования независимо от того, какой класс является дочерним?

Ответ 1

this.props.children должен быть либо ReactElement, либо массивом ReactElement, но не компонентами.

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

render() {
  return (
    <div>
      {React.Children.map(this.props.children, (element, idx) => {
        return React.cloneElement(element, { ref: idx });
      })}
    </div>
  );
}

Затем вы можете получить доступ к дочерним компонентам через this.refs[childIdx] и получить свои узлы DOM через ReactDOM.findDOMNode(this.refs[childIdx]).

Ответ 2

Если вы хотите получить доступ к любому элементу DOM, просто добавьте атрибут ref, и вы можете напрямую получить доступ к этому элементу.

<input type="text" ref="myinput">

И затем вы можете напрямую:

componentDidMount: function() 
{
    this.refs.myinput.select();

},

Их не нужно использовать ReactDOM.findDOMNode(), если вы добавили ref к любому элементу.

Ответ 3

Это может быть возможно с помощью атрибута refs.

В примере, когда вам нужно достичь <div>, вам нужно будет использовать <div ref="myExample">. Тогда вы сможете получить этот DOM node с помощью React.findDOMNode(this.refs.myExample).

Оттуда получение правильного DOM node каждого дочернего элемента может быть таким же простым, как отображение над this.refs.myExample.children (я еще не тестировал это), но вы, по крайней мере, сможете захватить какой-либо конкретный дочерний элемент node с помощью атрибута ref.

Здесь официальная реагирует на документацию по refs для получения дополнительной информации.

Ответ 4

React.findDOMNode(this.refs.myExample), упомянутый в другом ответе, был отброшен.

используйте ReactDOM.findDOMNode из 'react-dom' вместо

import ReactDOM from 'react-dom'
let myExample = ReactDOM.findDOMNode(this.refs.myExample)