Lo stato di $mol si comporta come un foglio di calcolo: dichiari come viene calcolato un valore e tutto ciò che ne dipende si aggiorna da solo. Niente store, niente dispatch, niente hook di effetto — il grafo delle dipendenze traccia cosa ricalcolare.
Un metodo decorato con @ $mol_mem è una cella reattiva memorizzata nella cache. Viene eseguito una volta, ricorda il suo risultato e ricalcola solo quando qualcosa che ha letto è cambiato.1namespace $.$${2export class $my_counterextends$.$my_counter{3@ $mol_memcount(){return 0}45@ $mol_memdoubled(){6return this.count()*27}8}9}doubled legge count, quindi si iscrive automaticamente a count. Modifica count e ogni vista che mostra doubled si aggiorna — non c'è nulla da iscrivere a mano.
Una proprietà è sia getter che setter: chiamala senza argomenti per leggere, con un argomento per scrivere.1@ $mol_action2increment(){3this.count(this.count()+1)4}
Questa sola distinzione mantiene prevedibile il codice reattivo:@ $mol_mem è un calcolo puro — legge solo altre celle e restituisce un valore.@ $mol_action è un effetto — scritture nello stato, chiamate di rete e timer vanno qui.Scrivere in una cella dall'interno di un @ $mol_mem crea un ciclo di feedback (la scrittura invalida una dipendenza, che ricalcola, che riscrive). $mol lo segnala come iscrizione circolare. La correzione è sempre la stessa: tieni gli effetti collaterali nelle azioni, mantieni puri i calcoli.In @ $mol_mem puoima nonI gestori dei pulsanti sono generati come @ $mol_mem sulla classe base; sovrascrivili con @ $mol_action affinché possano scrivere in sicurezza:1@ $mol_action2submit(){3this.saved(true)4}