Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос нашим менторам. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.
Об обучении на Хекслете

Refs

React по своей природе изолирует нас от прямой работы с DOM на 100%. Но нередко при интеграции сторонних компонентов, которые написаны не на React, возникает задача на прямой доступ к DOM. Также подобный механизм нужен для выделения текста, фокусов и проигрывания медиа.

React позволяет сделать это с помощью рефов (refs). Перед тем, как мы начнём его разбирать, хочу предупредить, что в нормальной ситуации он не нужен и следует максимально избегать его использования.

Рассмотрим задачу по фокусировке на поле ввода:

See the Pen js_react_refs_focus by Hexlet (@hexlet) on CodePen.

ref — это атрибут компонента, значением которого должен быть объект, созданный в конструкторе через функцию React.createRef(). Этот объект, в отличие от остальных данных, которые находятся в props или state, хранится как обычное свойство объекта. Имя свойства можно выбрать произвольно. Свойство current этого объекта даёт доступ к элементу DOM, именно его можно использовать в componentDidMount или componentDidUpdate.

this.<имя свойства>.current хранит внутри себя DOM-элемент того компонента, для которого был установлен ref. В примере выше это input: <input ref={this.textInput} />. DOM-элемент попадает туда (внутрь current) уже после того, как текущий компонент будет встроен в реальный DOM, а значит воспользоваться им можно только в указанных выше колбеках componentDidUpdate и componentDidMount.

Ниже приведён пример создания компонента обёртки над популярным jQuery-плагином Chosen.

See the Pen js_react_refs_dom by Hexlet (@hexlet) on CodePen.

Рефы также могут использоваться и на самописных компонентах, реализованных как классы.

Использование в реальном мире

С React удобно и легко работать до тех пор, пока мы остаёмся в рамках самого React, но большая часть существующих JS-библиотек взаимодействует с DOM напрямую, что фактически нивелирует преимущества React при их использовании. Например:

// https://github.com/kylefox/jquery-modal
$('#login-form').modal();

Включение в проект таких библиотек неизбежно приведёт к активному использованию методов жизненного цикла и сделает код сложным. По этой причине принято создавать так называемые компоненты-обёртки (врапперы), которые скрывают внутри себя все взаимодействие с DOM и наружу выставляют стандартный интерфейс React, а именно пропсы. Одной из таких задач является изменение размера контейнера. Один из вариантов решения — компонент react-resizable. Посмотрите на работу этого компонента:

const Resizable = require('react-resizable').Resizable; // or,
const ResizableBox = require('react-resizable').ResizableBox;

// ES6
import { ResizableBox } from 'react-resizable';

// ...
render() {
  return (
    <ResizableBox width={200} height={200} minConstraints={[100, 100]} maxConstraints={[300, 300]}>
      <span>Contents</span>
    </ResizableBox>
  );
}

Ничего в этом коде не напоминает о реальном DOM. Всё сводится к тому, что мы оборачиваем наш компонент в ResizableBox, который скрывает всю работу внутри себя. По такому же принципу устроены сотни и, может быть, тысячи других компонентов, которые доступны на GitHub. Вот некоторые из них:


<span class="translation_missing" title="translation missing: ru.web.courses.lessons.mentors.mentor_avatars">Mentor Avatars</span>

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят менторы из команды Хекслета или другие студенты.

Для полного доступа к курсу нужна профессиональная подписка

Профессиональная подписка откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, даст возможность обращаться за помощью к менторам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
115
курсов
892
упражнения
2241
час теории
3196
тестов

Зарегистрироваться

или войти в аккаунт

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 115 курсов, 2000+ часов теории
  • 800 практических заданий в браузере
  • 250 000 студентов

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Rambler
Логотип компании Bookmate
Логотип компании Botmother

Есть вопрос или хотите участвовать в обсуждении?

Зарегистрируйтесь или войдите в свой аккаунт

Отправляя форму, вы соглашаетесь c «Политикой конфиденциальности» и «Условиями оказания услуг».