Что такое «монтирование» в React js?

128

Я слишком часто слышу термин «монтировать», когда изучаю ReactJS. И, похоже, в отношении этого термина есть методы жизненного цикла и ошибки. Что именно React подразумевает под монтированием?

Примеры: componentDidMount() and componentWillMount()

ворота
источник

Ответы:

139

Основная задача React - выяснить, как изменить DOM для соответствия тому, что компоненты хотят отображать на экране.

React делает это путем «монтирования» (добавления узлов в DOM), «размонтирования» (удаления их из DOM) и «обновления» (внесения изменений в узлы, уже находящиеся в DOM).

Как узел React представлен как узел DOM и где и когда он появляется в дереве DOM, управляется API верхнего уровня . Чтобы лучше понять, что происходит, посмотрите на самый простой из возможных:

// JSX version: let foo = <FooComponent />;
let foo = React.createElement(FooComponent);

Так что же это такое fooи что с этим делать? fooна данный момент представляет собой простой объект JavaScript, который выглядит примерно так (упрощенно):

{
  type: FooComponent,
  props: {}
}

В настоящее время его нет нигде на странице, т.е. это не элемент DOM, не существует нигде в дереве DOM и, кроме узла элемента React, не имеет другого значимого представления в документе. Он просто сообщает React, что должно быть на экране, если этот элемент React будет отрисован.Он еще не "смонтирован".

Вы можете указать React, чтобы он «смонтировал» его в контейнер DOM, вызвав:

ReactDOM.render(foo, domContainer);

Это говорит React, что пора показывать fooна странице. React создаст экземпляр FooComponentкласса и вызовет его renderметод. Допустим, он отображает a <div />, в этом случае React создаст divдля него узел DOM и вставит его в контейнер DOM.

Этот процесс создания экземпляров и узлов DOM, соответствующих компонентам React, и их вставки в DOM называется монтированием.

Обратите внимание, что обычно вы вызываете только ReactDOM.render()для монтирования корневых компонентов. Вам не нужно вручную «монтировать» дочерние компоненты. Каждый раз, когда вызывается родительский компонент setState()и его renderметод говорит, что конкретный дочерний элемент должен быть отрисован в первый раз, React автоматически «монтирует» этот дочерний элемент в своего родителя.

Филип Дупанович
источник
9
Я хотел бы отметить, что при вызове React.createElement(FooComponent)вы не создаете экземпляр FooComponent. fooпредставляет собой виртуальное представление DOM, FooComponentтакже известного как элемент React. Но, возможно, именно это вы имели в виду под FooComponentтипом React . Несмотря на это, вы не монтируете компоненты в React, вы вызываете render, который, в свою очередь, может монтировать компонент, если необходимо создать фактический узел DOM для представления компонента в дереве DOM. Фактический монтаж - это событие, на котором это происходит впервые.
Джон Лейдегрен
5
Под монтированием понимается присоединение экземпляра компонента React к узлу DOM, что необходимо для обновления древовидной структуры / инкрементного рендеринга при последующих вызовах рендеринга.
Джон Лейдегрен
3
Я взял на себя смелость отредактировать этот ответ, потому что он уже принят, но в нем было довольно много неправильных представлений (например, вы не можете работать findDOMNodeс элементами React).
Дан Абрамов
1
Размонтирование @Rahamin происходит, когда компонент удаляется / заменяется, если вы перемещаетесь между сценами таким образом, что нет рендеринга, вам не гарантируется отключение сигнала. componentWillUnmount - это не то же самое, что выгрузка страницы.
John Leidegren 05
1
@Yossi вот пример явного монтажа и снимите монтажный компонент в наборе тестов: stackoverflow.com/a/55359234/6225838
CPHPython
38

React - это изоморфный / универсальный фреймворк. Это означает, что существует виртуальное представление дерева компонентов пользовательского интерфейса, отдельное от фактического рендеринга, выводимого в браузере. Из документации:

React работает так быстро, потому что никогда не обращается напрямую к DOM. React поддерживает быстрое представление DOM в памяти.

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

«Мы думаем, что истинные основы React - это просто идеи компонентов и элементов: возможность декларативно описать то, что вы хотите визуализировать. Эти части являются общими для всех этих разных пакетов. Части React, относящиеся к определенному рендерингу цели обычно не то, о чем мы думаем, когда думаем о React ". - Блог React js

Итак, напрашивается вывод, что React не зависит от рендеринга , а это означает, что его не волнует конечный результат. Это может быть дерево DOM в браузере, это может быть XML, собственные компоненты или JSON.

«Когда мы смотрим на такие пакеты, как react-native, react-art, react-canvas и react-three, становится ясно, что красота и суть React не имеют ничего общего с браузерами или DOM». - Блог React js

Теперь, когда вы знаете, как работает React, легко ответить на ваш вопрос :)

монтаж - это процесс вывода виртуального представления компонента в окончательное представление пользовательского интерфейса (например, DOM или собственные компоненты).

В браузере это означало бы вывод элемента React в фактический элемент DOM (например, HTML div или li ) в дереве DOM. В собственном приложении это означало бы вывод элемента React в собственный компонент. Вы также можете написать свой собственный рендерер и выводить компоненты React в JSON, XML или даже XAML, если у вас хватит смелости.

Итак, монтирование / размонтирование обработчиков критически важно для приложения React, потому что вы можете быть уверены, что компонент выводится / отображается только тогда, когда он монтируется . Однако componentDidMountобработчик вызывается только при рендеринге в фактическое представление пользовательского интерфейса (DOM или собственные компоненты), но не при рендеринге в строку HTML на сервере, используяrenderToString , что имеет смысл, поскольку компонент фактически не монтируется, пока не достигнет браузер и выполняет в нем.

И да, Mounting - это тоже неудачное / сбивающее с толку имя, если вы спросите меня. ИМХО componentDidRenderи componentWillRenderимена были бы намного лучше.

Фарис Засина
источник
6
Кто-то только что указал мне на этот ответ с другого форума. Я не думаю, что componentDidRenderэто замена, componentDidMountпотому что компонент может отображать несколько раз, когда свойства меняются после того, как он монтируется один раз.
Gaurav
@TheMinister Ее назвали «виртуальной DOM-библиотекой», потому что она изначально не была изоморфной, а фактически изначально была привязана к DOM. Сделать его изоморфным было поздно.
Isiah Meadows,
Итак, крепление взаимозаменяемо с рендером ? В таком случае, правда ли, что компонент монтируется / визуализируется для каждой из следующих гипотетических гипотез ?: (id === that.id) ? <Component /> : null| /app/items/:id| this.setState(...),
Cody
1
Ссылка на / react-js-the-king-of-universal-apps / не работает
Майкл
Я дважды редактировал сообщение, чтобы удалить неработающую ссылку /react-js-the-king-of-universal-apps/( с комментариями редактирования, четко указывающими, что это неработающая ссылка ), но коллеги оба раза отклоняли изменение . Может ли кто-нибудь подсказать мне, что не так при редактировании ответа и удалении неработающей ссылки?
Aaditya Sharma
12

Монтирование относится к компоненту в React (созданным узлам DOM), прикрепленному к некоторой части документа. Это оно!

Игнорируя React, вы можете думать об этих двух встроенных функциях как о монтировании:

replaceChild

AppendChild

Какие функции, вероятно, наиболее распространены в React для внутреннего монтирования.

Думать о:

componentWillMount === до монтирования

И:

componentDidMount === после монтирования

frontsideup
источник
Если монтаж аналогичен appendChild, то какой render?
Deke
Я думаю, вы могли бы сказать, renderчто это фактический метод, который сделает сам монтаж. Итак, componentWillMount== до, render== выполняет вставку DOM, а componentDidMount== после монтирования (или renderвызвал DOM API для вставки компонента, и эта асинхронная операция полностью завершена)
Роб
8

https://facebook.github.io/react/docs/tutorial.html

Здесь componentDidMount - это метод, автоматически вызываемый React при рендеринге компонента.

Идея заключается в том, что вы говорите ReactJS: «Пожалуйста, возьмите эту штуку, это поле для комментариев или вращающееся изображение, или что-то еще, что я хочу на странице браузера, и продолжайте и фактически поместите его на страницу браузера. Когда это будет сделано, позвоните моя функция, к которой я привязан, componentDidMountчтобы продолжить ".

componentWillMountнаоборот. Он будет срабатывать немедленно ПЕРЕД рендерингом вашего компонента.

См. Также здесь https://facebook.github.io/react/docs/component-specs.html

Наконец, термин «монтировать» кажется уникальным для react.js. Я не думаю, что это общая концепция javascript или даже общая концепция браузера.

Росс Прессер
источник
так крепление можно назвать "размещенным"?
gates
Я бы сказал так, да.
Росс Прессер
Я бы сказал, что цитата несколько вводит в заблуждение, так как вызывается только после первоначального рендеринга, а не при повторных рендерингах, вызванных обновлениями. Тогда componentDidUpdateвместо этого вызывается.
Ханнес Йоханссон
+1 для этого facebook.github.io/react/docs/… , описание там подтверждает, что он размещен;)
gates
5

Монтирование относится к начальной загрузке страницы, когда ваш компонент React впервые отображается. Из документации React для монтирования: componentDidMount:

Invoked once, only on the client (not on the server), immediately after the initial rendering occurs. At this point in the lifecycle, the component has a DOM representation which you can access via React.findDOMNode(this).

Вы можете сравнить это с функцией componentDidUpdate, которая вызывается каждый раз, когда React отображает (кроме начального монтирования).

Марк Браунсворд
источник
3

Основная цель React js - создавать повторно используемые компоненты. Здесь компоненты - это отдельные части веб-страницы. Например, на веб-странице заголовок - это компонент, нижний колонтитул - это компонент, всплывающее уведомление - это компонент и т. Д. Термин «монтирование» говорит нам, что эти компоненты загружаются или отображаются в DOM. Это множество API верхнего уровня и методов, решающих эту проблему.

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

Пранеш Рави
источник