L'état de $mol se comporte comme un tableur : vous déclarez comment une valeur est calculée, et tout ce qui en dépend se met à jour tout seul. Pas de stores, pas de dispatch, pas de hooks d'effet — le graphe de dépendances suit ce qu'il faut recalculer.
Une méthode décorée avec @ $mol_mem est une cellule réactive mise en cache. Elle s'exécute une fois, mémorise son résultat et ne recalcule que lorsqu'une valeur qu'elle a lue a changé.1namespace $.$${2export class $my_counterextends$.$my_counter{3@ $mol_memcount(){return 0}45@ $mol_memdoubled(){6return this.count()*27}8}9}doubled lit count, il s'abonne donc automatiquement à count. Modifiez count et chaque vue affichant doubled se rafraîchit — il n'y a rien à abonner à la main.
Une propriété est à la fois getter et setter : appelez-la sans argument pour lire, avec un argument pour écrire.1@ $mol_action2increment(){3this.count(this.count()+1)4}
Cette seule distinction garde le code réactif prévisible :@ $mol_mem est un calcul pur — ne fait que lire d'autres cellules et renvoyer une valeur.@ $mol_action est un effet — les écritures dans l'état, les appels réseau et les minuteries vont ici.Écrire dans une cellule depuis un @ $mol_mem crée une boucle de rétroaction (l'écriture invalide une dépendance, qui recalcule, qui réécrit). $mol le signale comme un abonnement circulaire. Le correctif est toujours le même : gardez les effets de bord dans les actions, gardez les calculs purs.Dans @ $mol_mem vous pouvezmais pasLes gestionnaires de boutons sont générés en @ $mol_mem sur la classe de base ; surchargez-les avec @ $mol_action pour qu'ils puissent écrire en toute sécurité :1@ $mol_action2submit(){3this.saved(true)4}