mount(root, component)
Opis
Aktywuje komponent, umożliwiając jego automatyczne odświeżanie w odpowiedzi na interakcje użytkownika.
var state = {
count: 0,
inc: function () {
state.count++;
},
};
var Counter = {
view: function () {
return m('div', { onclick: state.inc }, state.count);
},
};
m.mount(document.body, Counter);Aby przekazać argumenty do komponentu podczas montowania, użyj:
m.mount(element, {
view: function () {
return m(Component, attrs);
},
});Sygnatura
m.mount(element, Component)
| Argument | Typ | Wymagany | Opis |
|---|---|---|---|
element | Element | Tak | Element DOM, który będzie węzłem nadrzędnym dla renderowanego poddrzewa. |
Component | Component|null | Tak | Komponent do wyrenderowania. Użycie null odmontowuje drzewo i czyści stan wewnętrzny. |
| zwraca | Funkcja nie zwraca żadnej wartości. |
Jak to działa
m.mount(element, Component) renderuje komponent do wskazanego elementu i rejestruje parę (element, Component) w systemie odświeżania. Drzewo DOM zostanie ponownie wyrenderowane podczas ręcznego lub automatycznego odświeżania.
Podczas odświeżania, nowe drzewo vDOM (wirtualny DOM) jest porównywane (lub "różnicowane") ze starym, a istniejące drzewo DOM jest modyfikowane tylko w miejscach, gdzie jest to konieczne, aby odzwierciedlić zmiany. Niezmienione węzły DOM pozostają nietknięte.
Zastępowanie komponentu
Wywołanie mount(element, OtherComponent), gdzie element jest aktualnym punktem montowania, zastępuje wcześniej zamontowany komponent OtherComponent.
Odmontowywanie
Użycie m.mount(element, null) na elemencie, który ma już zamontowany komponent, odmontowuje go i czyści stan wewnętrzny Mithril.js. Jest to przydatne w zapobieganiu wyciekom pamięci, gdy ręcznie usuwasz węzeł root z DOM.
Montowanie bez renderowania
W zaawansowanych scenariuszach możesz chcieć subskrybować i nasłuchiwać odświeżania bez renderowania czegokolwiek na ekranie. Można to osiągnąć poprzez montowanie bez renderowania, wywołując m.mount z elementem, który nie jest dodany do aktywnego drzewa DOM, i umieszczając całą logikę w montowanym komponencie. Komponent musi posiadać metodę view, która może zwracać null lub undefined.
var elem = document.createElement('div');
// Subskrybuj
m.mount(elem, {
oncreate: function () {
// Wywoływane raz, po dodaniu
},
onupdate: function () {
// Wywoływane przy każdym ponownym rysowaniu
},
onremove: function () {
// Wyczyść zasoby
},
// Wymagany szablon
view: function () {},
});
// Zakończ subskrypcję
m.mount(elem, null);Nie musisz się martwić o konflikty z innymi punktami montowania. Obsługiwane jest wiele punktów montowania i nie będą one ze sobą kolidować. Możesz nawet użyć powyższego kodu w komponencie podczas integracji z innym frameworkiem i nie spowoduje to problemów.
Aspekty wydajnościowe
Generowanie drzewa vnode przy każdym odświeżeniu może wydawać się nieefektywne, ale tworzenie i porównywanie struktur danych JavaScript jest zaskakująco tanie w porównaniu z odczytywaniem i modyfikowaniem DOM.
Interakcje z DOM mogą być kosztowne z kilku powodów. Naprzemienne odczyty i zapisy mogą negatywnie wpływać na wydajność, powodując wielokrotne odświeżanie przeglądarki w krótkim czasie, podczas gdy porównywanie wirtualnych drzew DOM pozwala na łączenie zapisów w jedno odświeżenie. Ponadto, wydajność różnych operacji DOM różni się w zależności od implementacji i może być trudna do optymalizacji dla wszystkich przeglądarek. Na przykład, w niektórych implementacjach odczyt childNodes.length ma złożoność O(n); w niektórych odczyt parentNode powoduje odświeżenie, itp.
Z drugiej strony, operacje na strukturach danych JavaScript mają bardziej przewidywalny i rozsądny profil wydajności, a drzewo vnode jest zaimplementowane w sposób, który umożliwia nowoczesnym silnikom JavaScript stosowanie agresywnych optymalizacji, takich jak ukryte klasy, co dodatkowo poprawia wydajność.
Różnice w stosunku do m.render
Komponent renderowany za pomocą m.mount automatycznie się odświeża w odpowiedzi na zdarzenia w widoku, wywołania m.redraw() lub wywołania m.request(). Vnode renderowane za pomocą m.render() nie posiadają tej funkcjonalności.
m.mount() jest odpowiedni dla programistów aplikacji integrujących widżety Mithril.js z istniejącymi bazami kodu, gdzie routing jest obsługiwany przez inną bibliotekę lub framework, ale chcą korzystać z automatycznego odświeżania Mithril.js.
m.render() jest odpowiedni dla autorów bibliotek, którzy chcą ręcznie kontrolować proces renderowania (np. podczas integracji z routerem innej firmy lub korzystania z bibliotek warstwy danych innej firmy, takich jak Redux).