findDOMNode¶
Устарело
Этот API будет удален в одной из будущих основных версий React.
findDOMNode находит узел DOM браузера для экземпляра классового компонента React.
1 | |
Описание¶
findDOMNode(componentInstance)¶
Вызывает findDOMNode для поиска узла DOM браузера для данного экземпляра классового компонента React.
1 2 3 | |
Параметры
componentInstance: Экземпляр подклассаComponent. Например,thisвнутри компонента класса.
Возвращает
findDOMNode возвращает первый ближайший DOM-узел браузера в пределах заданного componentInstance. Если компонент отображается на null, или отображается false, findDOMNode возвращает null. Если компонент отображается в строку, findDOMNode возвращает текстовый узел DOM, содержащий это значение.
Ограничения
- Компонент может возвращать массив или фрагмент с несколькими дочерними элементами. В этом случае
findDOMNodeвернет узел DOM, соответствующий первому непустому дочернему компоненту. findDOMNodeработает только для смонтированных компонентов (то есть компонентов, которые были помещены в DOM). Если вы попытаетесь вызвать эту функцию на компоненте, который еще не смонтирован (например, вызватьfindDOMNode()вrender()на компоненте, который еще не создан), будет выброшено исключение.findDOMNodeвозвращает результат только на момент вызова. Если дочерний компонент позже отобразит другой узел, у вас не будет возможности получить уведомление об этом изменении.findDOMNodeпринимает экземпляр компонента класса, поэтому его нельзя использовать с компонентами функций.
Использование¶
Нахождение корневого DOM-узла компонента класса¶
Вызовите findDOMNode с экземпляром классового компонента (обычно this), чтобы найти DOM-узел, который он отобразил.
1 2 3 4 5 6 7 8 9 10 | |
Здесь переменная input будет установлена на элемент DOM <input>. Это позволит вам сделать с ним что-нибудь. Например, при нажатии на кнопку "Показать пример" ниже монтируется ввод, input.select() выделяет весь текст во вводе:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
Альтернативы¶
Чтение собственного DOM-узла компонента из ссылки¶
Код, использующий findDOMNode, хрупок, поскольку связь между узлом JSX и кодом, манипулирующим соответствующим узлом DOM, не является явной. Например, попробуйте обернуть этот input в div:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Это нарушит код, поскольку теперь findDOMNode(this) находит DOM-узел <div>, но код ожидает DOM-узел <input>. Чтобы избежать подобных проблем, используйте createRef для управления конкретным узлом DOM.
В этом примере findDOMNode больше не используется. Вместо этого inputRef = createRef(null) определяется как поле экземпляра класса. Для чтения DOM-узла из него можно использовать this.inputRef.current. Чтобы присоединить его к JSX, вы рендерите <input ref={this.inputRef} />. Это соединяет код, использующий узел DOM, с его JSX:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
В современном React без компонентов классов эквивалентный код будет вызывать useRef вместо этого:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
Подробнее о манипулировании DOM с помощью ссылок
Чтение узла DOM дочернего компонента из переадресованной ссылки¶
В этом примере findDOMNode(this) находит узел DOM, принадлежащий другому компоненту. Компонент AutoselectingInput отображает MyInput, который является вашим собственным компонентом, отображающим браузерный <input>.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 | |
Обратите внимание, что вызов findDOMNode(this) внутри AutoselectingInput все еще дает вам DOM input - несмотря на то, что JSX для этого input скрыт внутри компонента MyInput. Это кажется удобным для приведенного выше примера, но это приводит к хрупкому коду. Представьте, что вы захотите отредактировать MyInput позже и добавить обертку div вокруг него. Это нарушит код AutoselectingInput (который ожидает найти <input>).
Чтобы заменить findDOMNode в этом примере, необходимо согласовать два компонента:
1. AutoSelectingInput должен объявить ref, как в предыдущем примере, и передать его в <MyInput>.
2. MyInput должен быть объявлен с forwardRef, чтобы принять эту ссылку и передать ее узлу <input>.
Эта версия делает это, поэтому больше не требуется findDOMNode:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 | |
Вот как выглядел бы этот код с компонентами функций вместо классов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 | |
Добавление элемента-обертки <div>¶
Иногда компоненту необходимо знать положение и размер своих дочерних элементов. Это делает заманчивым найти дочерние элементы с помощью findDOMNode(this), а затем использовать методы DOM, такие как getBoundingClientRect для измерений.
В настоящее время не существует прямого эквивалента для этого случая использования, поэтому findDOMNode устарел, но еще не полностью удален из React. Тем временем, в качестве обходного пути вы можете попробовать отобразить узел-обертку <div> вокруг содержимого и получить ссылку на этот узел. Однако дополнительные обертки могут нарушить стилизацию.
1 | |
Это также относится к фокусировке и прокрутке к произвольным дочерним элементам.
Источник — https://react.dev/reference/react-dom/findDOMNode