HTML Diff
2 added 2 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>React по своей природе изолирует вас от прямой работы с DOM на 100%. Но нередко при интеграции сторонних компонентов, которые написаны не на React, возникает задача на прямой доступ к DOM. Также подобный механизм нужен для выделения текста, фокусов и проигрывания медиа.</p>
1 <p>React по своей природе изолирует вас от прямой работы с DOM на 100%. Но нередко при интеграции сторонних компонентов, которые написаны не на React, возникает задача на прямой доступ к DOM. Также подобный механизм нужен для выделения текста, фокусов и проигрывания медиа.</p>
2 <p>React позволяет сделать это с помощью<em>рефов</em>(refs). Важно понимать, что в нормальной ситуации этот механизм не нужен и следует максимально избегать его использования.</p>
2 <p>React позволяет сделать это с помощью<em>рефов</em>(refs). Важно понимать, что в нормальной ситуации этот механизм не нужен и следует максимально избегать его использования.</p>
3 <p>Рассмотрим задачу по фокусировке на поле ввода:</p>
3 <p>Рассмотрим задачу по фокусировке на поле ввода:</p>
4 - <p><a>https://codepen.io/hexlet/pen/PJoGXM</a></p>
4 + <p><a>Попрактиковаться</a></p>
5 <p><em>ref</em>- это атрибут компонента, значением которого должен быть объект, созданный в конструкторе через функцию React.createRef(). Этот объект, в отличие от остальных данных, которые находятся в props или state, хранится как обычное свойство объекта. Имя свойства можно выбрать произвольно. Свойство current этого объекта даёт доступ к элементу DOM, именно его можно использовать в componentDidMount или componentDidUpdate.</p>
5 <p><em>ref</em>- это атрибут компонента, значением которого должен быть объект, созданный в конструкторе через функцию React.createRef(). Этот объект, в отличие от остальных данных, которые находятся в props или state, хранится как обычное свойство объекта. Имя свойства можно выбрать произвольно. Свойство current этого объекта даёт доступ к элементу DOM, именно его можно использовать в componentDidMount или componentDidUpdate.</p>
6 <p>this.&lt;имя свойства&gt;.current хранит внутри себя DOM-элемент того компонента, для которого был установлен<em>ref</em>. В примере выше это<em>input</em>: &lt;input ref={this.textInput} /&gt;. DOM-элемент попадает туда (внутрь<em>current</em>) уже после того, как текущий компонент будет встроен в реальный DOM, а значит им можно воспользоваться в указанных выше колбеках componentDidUpdate и componentDidMount.</p>
6 <p>this.&lt;имя свойства&gt;.current хранит внутри себя DOM-элемент того компонента, для которого был установлен<em>ref</em>. В примере выше это<em>input</em>: &lt;input ref={this.textInput} /&gt;. DOM-элемент попадает туда (внутрь<em>current</em>) уже после того, как текущий компонент будет встроен в реальный DOM, а значит им можно воспользоваться в указанных выше колбеках componentDidUpdate и componentDidMount.</p>
7 <p>Ниже приведён пример создания компонента обёртки над популярным jQuery-плагином<a>Chosen</a>.</p>
7 <p>Ниже приведён пример создания компонента обёртки над популярным jQuery-плагином<a>Chosen</a>.</p>
8 - <p><a>https://codepen.io/hexlet/pen/qPBjEB</a></p>
8 + <p><a>Попрактиковаться</a></p>
9 <p><em>Рефы</em>также могут использоваться и на самописных компонентах, реализованных как классы.</p>
9 <p><em>Рефы</em>также могут использоваться и на самописных компонентах, реализованных как классы.</p>
10 <h2>Использование в реальном мире</h2>
10 <h2>Использование в реальном мире</h2>
11 <p>С React удобно и легко работать до тех пор, пока мы остаёмся в рамках самого React, но большая часть существующих JS-библиотек взаимодействует с DOM напрямую, что фактически нивелирует преимущества React при их использовании. Например:</p>
11 <p>С React удобно и легко работать до тех пор, пока мы остаёмся в рамках самого React, но большая часть существующих JS-библиотек взаимодействует с DOM напрямую, что фактически нивелирует преимущества React при их использовании. Например:</p>
12 <p>Включение в проект таких библиотек неизбежно приведёт к активному использованию методов жизненного цикла и сделает код сложным. По этой причине принято создавать так называемые компоненты-обёртки (врапперы), которые скрывают внутри себя все взаимодействие с DOM и наружу выставляют стандартный интерфейс React, а именно пропсы. Одной из таких задач, с взаимодействием с DOM, является изменение размера контейнера. Один из вариантов решения - компонент<a>react-resizable</a>. Посмотрите на работу этого компонента:</p>
12 <p>Включение в проект таких библиотек неизбежно приведёт к активному использованию методов жизненного цикла и сделает код сложным. По этой причине принято создавать так называемые компоненты-обёртки (врапперы), которые скрывают внутри себя все взаимодействие с DOM и наружу выставляют стандартный интерфейс React, а именно пропсы. Одной из таких задач, с взаимодействием с DOM, является изменение размера контейнера. Один из вариантов решения - компонент<a>react-resizable</a>. Посмотрите на работу этого компонента:</p>
13 <p>Ничего в этом коде не напоминает о реальном DOM. Всё сводится к тому, что компонент оборачивается в ResizableBox, который скрывает всю работу внутри себя. По такому же принципу устроены сотни и, может быть, тысячи других компонентов, которые доступны на GitHub. Вот некоторые из них:</p>
13 <p>Ничего в этом коде не напоминает о реальном DOM. Всё сводится к тому, что компонент оборачивается в ResizableBox, который скрывает всю работу внутри себя. По такому же принципу устроены сотни и, может быть, тысячи других компонентов, которые доступны на GitHub. Вот некоторые из них:</p>
14 <ul><li><a>react-hotkeys</a></li>
14 <ul><li><a>react-hotkeys</a></li>
15 <li><a>react-stripe-elements (платёжный шлюз)</a></li>
15 <li><a>react-stripe-elements (платёжный шлюз)</a></li>
16 </ul>
16 </ul>