Стан $mol поводиться як електронна таблиця: ви оголошуєте, як обчислюється значення, і все, що від нього залежить, оновлюється саме. Ніяких сховищ, ніякого dispatch, ніяких хуків ефектів — граф залежностей відстежує, що переобчислити.
Метод, оздоблений @ $mol_mem, — це кешована реактивна комірка. Вона виконується один раз, запам'ятовує свій результат і переобчислюється лише тоді, коли змінилося щось, що вона прочитала.1namespace $.$${2export class $my_counterextends$.$my_counter{3@ $mol_memcount(){return 0}45@ $mol_memdoubled(){6return this.count()*27}8}9}doubled читає count, тож автоматично підписується на count. Змініть count — і кожне подання, що показує doubled, оновиться: підписуватися вручну не потрібно.
Властивість є водночас гетером і сетером: викличте її без аргументу, щоб прочитати, з аргументом — щоб записати.1@ $mol_action2increment(){3this.count(this.count()+1)4}
Ця єдина відмінність робить реактивний код передбачуваним:@ $mol_mem — це чисте обчислення: лише читає інші комірки й повертає значення.@ $mol_action — це ефект: записи в стан, мережеві виклики й таймери належать сюди.Запис у комірку зсередини @ $mol_mem створює петлю зворотного зв'язку (запис знецінює залежність, яка переобчислюється й знову записує). $mol повідомляє про це як про циклічну підписку. Виправлення завжди одне: тримайте побічні ефекти в діях, а обчислення — чистими.У @ $mol_mem можнаале не можнаОбробники кнопок генеруються як @ $mol_mem у базовому класі; перевизначте їх через @ $mol_action, щоб вони могли безпечно записувати:1@ $mol_action2submit(){3this.saved(true)4}