Stan $mol zachowuje się jak arkusz kalkulacyjny: deklarujesz, jak obliczana jest wartość, a wszystko, co od niej zależy, aktualizuje się samo. Bez store'ów, bez dispatch, bez hooków efektów — graf zależności śledzi, co przeliczyć.
Metoda ozdobiona @ $mol_mem to buforowana, reaktywna komórka. Wykonuje się raz, zapamiętuje swój wynik i przelicza tylko wtedy, gdy zmieniło się coś, co przeczytała.1namespace $.$${2export class $my_counterextends$.$my_counter{3@ $mol_memcount(){return 0}45@ $mol_memdoubled(){6return this.count()*27}8}9}doubled czyta count, więc automatycznie subskrybuje count. Zmień count, a każdy widok pokazujący doubled się odświeży — nie ma nic do ręcznego subskrybowania.
Właściwość jest zarówno getterem, jak i setterem: wywołaj ją bez argumentu, aby odczytać, z argumentem, aby zapisać.1@ $mol_action2increment(){3this.count(this.count()+1)4}
To jedno rozróżnienie utrzymuje kod reaktywny przewidywalnym:@ $mol_mem to czyste obliczenie — tylko czyta inne komórki i zwraca wartość.@ $mol_action to efekt — zapisy do stanu, wywołania sieciowe i timery należą tutaj.Zapis do komórki z wnętrza @ $mol_mem tworzy pętlę sprzężenia zwrotnego (zapis unieważnia zależność, która się przelicza, która znów zapisuje). $mol zgłasza to jako cykliczną subskrypcję. Poprawka jest zawsze ta sama: trzymaj efekty uboczne w akcjach, utrzymuj obliczenia czyste.W @ $mol_mem możeszale nieHandlery przycisków są generowane jako @ $mol_mem na klasie bazowej; nadpisz je przez @ $mol_action, aby mogły bezpiecznie zapisywać:1@ $mol_action2submit(){3this.saved(true)4}