EnglishBac à sable

Les valeurs dérivées

Un mémo dérive une valeur d'autres sources réactives. Il met son résultat en cache et ne se recalcule que lorsqu'une de ses dépendances change :

import { signal, memo } from '@fluixi/reactive/signal';

const first = signal('Ada');
const last  = signal('Lovelace');

const fullName = memo(() => `${first()} ${last()}`);

fullName(); // « Ada Lovelace »

Paresseux et mis en cache

Un mémo ne calcule que lorsqu'il est lu, et ne recalcule que si une dépendance change vraiment. Le relire renvoie la valeur en cache, gratuitement :

const expensive = memo(() => heavyCompute(data()));
expensive(); // calcule une fois
expensive(); // en cache — aucun recalcul

Si rien n'observe un mémo, il ne s'exécute jamais.

Sans incohérence (glitch-free)

Quand un changement se diffuse puis re-converge, un mémo recalcule exactement une fois avec des entrées cohérentes — jamais avec une valeur à moitié mise à jour :

const a = signal(1);
const b = memo(() => a() + 1);
const c = memo(() => a() * 2);
const d = memo(() => b() + c()); // recalcule une seule fois par changement de a

a.set(2); // d recalcule une seule fois

La forme accesseur

createMemo renvoie le même mémo sous forme d'accesseur simple :

import { createMemo } from '@fluixi/reactive/signal';

const fullName = createMemo(() => `${first()} ${last()}`);
fullName(); // « Ada Lovelace »

memo, c'est cet accesseur rangé dans un objet sous get : une seule primitive, qui se mélange librement avec des signaux écrits d'une façon ou de l'autre.

Suivant : Les effets.