Głównym zadaniem Reacta jest wymyślenie, jak zmodyfikować DOM, aby dopasować komponenty, które mają być renderowane na ekranie.
React robi to przez "montowanie" (dodawanie węzłów do DOM), "odmontowywanie" (usuwanie ich z DOM) i "aktualizowanie" (wprowadzanie zmian do węzłów już w DOM).
To, jak węzeł React jest reprezentowany jako węzeł DOM oraz gdzie i kiedy pojawia się w drzewie DOM, jest zarządzane przez API najwyższego poziomu . Aby lepiej zrozumieć, co się dzieje, spójrz na najprostszy możliwy przykład:
// JSX version: let foo = <FooComponent />;
let foo = React.createElement(FooComponent);
Więc co to jest foo
i co możesz z tym zrobić? foo
w tej chwili jest zwykłym obiektem JavaScript, który wygląda mniej więcej tak (uproszczony):
{
type: FooComponent,
props: {}
}
Obecnie nie ma go nigdzie na stronie, tj. Nie jest elementem DOM, nie istnieje nigdzie w drzewie DOM i poza tym, że jest węzłem elementu React, nie ma innej znaczącej reprezentacji w dokumencie. Po prostu mówi Reactowi, co musi być na ekranie, jeśli ten element React zostanie renderowany. Nie jest jeszcze „zamontowany”.
Możesz nakazać Reactowi „zamontowanie” go w kontenerze DOM, wywołując:
ReactDOM.render(foo, domContainer);
To mówi Reactowi, że czas pokazać foo
się na stronie. React utworzy instancję FooComponent
klasy i wywoła jej render
metodę. Powiedzmy, że renderuje a <div />
, w takim przypadku React utworzy div
dla niego węzeł DOM i wstawi go do kontenera DOM.
Ten proces tworzenia instancji i węzłów DOM odpowiadających komponentom React i wstawiania ich do DOM nazywa się montowaniem.
Zauważ, że normalnie wywołujesz tylko w ReactDOM.render()
celu zamontowania komponentów root. Nie ma potrzeby ręcznego „montowania” komponentów podrzędnych. Za każdym razem, gdy wywoływany jest komponent nadrzędny setState()
, a jego render
metoda mówi, że określone dziecko powinno zostać wyrenderowane po raz pierwszy, React automatycznie „zamontuje” to dziecko w jego rodzicu.
React.createElement(FooComponent)
, nie tworzysz instancjiFooComponent
.foo
jest wirtualną reprezentacją DOMFooComponent
znaną również jako element React. Ale może to właśnie miałeś na myśli przezFooComponent
typ React . Niezależnie od tego, nie montujesz komponentów w React, wywołujesz render, który z kolei może zamontować komponent, jeśli trzeba utworzyć rzeczywisty węzeł DOM, aby reprezentował komponent w drzewie DOM. Rzeczywisty montaż jest zdarzeniem, w którym dzieje się to po raz pierwszy.findDOMNode
na elementach React).React to izomorficzna / uniwersalna struktura. Oznacza to, że istnieje wirtualna reprezentacja drzewa składników interfejsu użytkownika, która jest niezależna od rzeczywistego renderowania, które generuje w przeglądarce. Z dokumentacji:
Jednak ta reprezentacja w pamięci nie jest bezpośrednio powiązana z DOM w przeglądarce (mimo że nazywa się Virtual DOM, co jest niefortunną i mylącą nazwą dla uniwersalnej struktury aplikacji), a jest to po prostu dane przypominające DOM struktura, która reprezentuje wszystkie hierarchie składników interfejsu użytkownika i dodatkowe metadane. Wirtualny DOM to tylko szczegół implementacji.
Zatem wniosek jest taki, że React jest agnostykiem renderowania , co oznacza, że nie dba o to, jaki będzie wynik końcowy. Może to być drzewo DOM w przeglądarce, może to być XML, komponenty natywne lub JSON.
Skoro już wiesz, jak działa React, łatwo odpowiedzieć na Twoje pytanie :)
Montowanie to proces wyprowadzania wirtualnej reprezentacji komponentu do ostatecznej reprezentacji UI (np. DOM lub Komponenty natywne).
W przeglądarce oznaczałoby to umieszczenie elementu React w rzeczywistym elemencie DOM (np. HTML div lub li ) w drzewie DOM. W aplikacji natywnej oznaczałoby to wyprowadzenie elementu React do komponentu natywnego. Możesz także napisać własny renderer i wyprowadzić komponenty React w JSON lub XML, a nawet XAML, jeśli masz odwagę.
Tak więc, moduły obsługi montowania / odmontowywania są krytyczne dla aplikacji React, ponieważ możesz mieć pewność, że komponent zostanie wyprowadzony / wyrenderowany po zamontowaniu . Jednakże
componentDidMount
moduł obsługi jest wywoływany tylko podczas renderowania do rzeczywistej reprezentacji interfejsu użytkownika (DOM lub Native Components), ale nie w przypadku renderowania do ciągu HTML na serwerze przy użyciurenderToString
, co ma sens, ponieważ komponent nie jest faktycznie montowany, dopóki nie osiągnie przeglądarka i uruchamia się w niej.I tak, montaż to również niefortunna / myląca nazwa, jeśli o mnie chodzi. IMHO
componentDidRender
icomponentWillRender
byłoby znacznie lepszymi nazwami.źródło
componentDidRender
aby zastępował,componentDidMount
ponieważ komponent może renderować się wiele razy, gdy rekwizyty zmieniają się po jednokrotnym zamontowaniu.(id === that.id) ? <Component /> : null
|/app/items/:id
|this.setState(...)
./react-js-the-king-of-universal-apps/
( z komentarzami edycji wyraźnie wskazującymi, że jest to uszkodzony link ), ale koledzy odrzucili edycję za każdym razem . Czy ktoś może mi pomóc, co jest nie tak w edytowaniu odpowiedzi i usuwaniu uszkodzonego łącza?Montowanie odnosi się do komponentu w React (utworzone węzły DOM) dołączanego do jakiejś części dokumentu. Otóż to!
Ignorując Reacta możesz myśleć o tych dwóch natywnych funkcjach jako o montowaniu:
replaceChild
appendChild
Które są prawdopodobnie najbardziej powszechnymi funkcjami używanymi przez React do montowania wewnętrznego.
Myśleć o:
componentWillMount === przed zamontowaniem
I:
componentDidMount === po zamontowaniu
źródło
appendChild
, to co to jestrender
?render
jest to właściwa metoda, która sama zrobi montaż. Tak więccomponentWillMount
== przed,render
== wstawia DOM icomponentDidMount
== po zamontowaniu (lubrender
wywołał interfejs API DOM w celu wstawienia komponentu i operacja asynchroniczna została w pełni zakończona)https://facebook.github.io/react/docs/tutorial.html
Chodzi o to, że mówisz ReactJS: „weź to, proszę, to pole komentarza, obracający się obrazek, czy cokolwiek chcę na stronie przeglądarki, i umieść to na stronie przeglądarki. Kiedy to zrobisz, zadzwoń moja funkcja, do której się zobowiązałem,
componentDidMount
więc mogę kontynuować ”.componentWillMount
jest odwrotnie. Zapali się natychmiast PRZED renderowaniem komponentu.Zobacz także tutaj https://facebook.github.io/react/docs/component-specs.html
Wreszcie, termin „montowanie” wydaje się być unikatowy w przypadku respond.js. Nie sądzę, że jest to ogólna koncepcja javascript, czy nawet ogólna koncepcja przeglądarki.
źródło
componentDidUpdate
jest wywoływana zamiast.Montowanie odnosi się do początkowego wczytywania strony, kiedy komponent React jest po raz pierwszy renderowany. Z dokumentacji React do montażu: 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).
Możesz to porównać z funkcją componentDidUpdate, która jest wywoływana za każdym razem, gdy React renderuje (z wyjątkiem początkowego montowania).
źródło
Głównym celem React js jest tworzenie komponentów wielokrotnego użytku. W tym przypadku komponenty to poszczególne części strony internetowej. Na przykład na stronie internetowej nagłówek jest komponentem, stopka jest komponentem, wyskakujące powiadomienie jest komponentem itd. Termin „mount” mówi nam, że te komponenty są ładowane lub renderowane w DOM. Oto wiele API i metod najwyższego poziomu, które sobie z tym radzą.
Upraszczając, zamontowanie oznacza, że komponent został załadowany do DOM, a odmontowany oznacza, że komponenty zostały usunięte z DOM.
źródło