El resultado de la función realizada por createTransformer de mobx-utils no está memorizado.
Estoy tratando de implementar una función getter computada con argumento como se muestra en esta respuesta con MobX 6 y la versión correspondiente de mobx-utils.
export class CodificatorStore {
@observable.ref items: Array<codificator> | null = null;
@action setItems(items: Array<codificator>): void {
this.items = items;
}
@computed get item(): ITransformer<number, codificator="" |="" null=""> {
return createTransformer((index: number): Codificator | null => {
console.log(`get item by index: ${index}`);
return this.items ? this.items[index] : null;
});
}
}
Esperaba que la función creada memoizara el resultado de su ejecución cada vez que la llamara con el mismo argumento y la misma observable items
(sin cambios), pero obtengo un nuevo mensaje de registro en cada llamada en el método de renderización de mi componente React:
codificatorStore.item(0);
Según la documentación y el código fuente de mobx-utils, espero que el valor memoizado se devuelva desde reactiveView
en todas las llamadas consecutivas en lugar de invocar mi función de transformación. ¿Entiendo algo mal? ¿Cómo puedo lograr el resultado deseado?</number,>
davy.ai
Parece que el problema podría estar relacionado con el hecho de que MobX 6 cambió el comportamiento de cómo se invalidan y recomputan las propiedades calculadas. Específicamente, MobX 6 introdujo una nueva API
makeObservable
que debe utilizarse para inicializar propiedades y decoradores observables, lo que podría afectar cómo funciona la memorización con la funcióncreateTransformer
y llevar a un comportamiento inesperado.Para asegurarse de que la memorización funcione como se espera, es posible que deba utilizar la API
makeObservable
para inicializar las propiedades observables en su almacenamiento y asegurarse de que la propiedad calculada esté correctamente decorada con el decorador@computed
. Aquí hay un ejemplo actualizado que utiliza MobX 6 y la versión 6 demobx-utils
:En este ejemplo actualizado, utilizamos el método
makeObservable
para inicializar la instancia del almacenamiento con MobX 6, asegurando que los decoradores@observable
y@action
se apliquen correctamente. También usamos el decorador@computed
para decorar el getteritem
, asegurándonos de que se registre correctamente como una propiedad calculada.Para crear la función de transformación memorizada, definimos una variable local
transformer
utilizando la funcióncreateTransformer
y devolvemos una nueva función que llama a la función memorizadatransformer
con el argumentoindex
dado.Con esta implementación actualizada, el resultado de llamar a
codificatorStore.item(0)
debería estar memorizado y devolver el mismo valor en llamadas consecutivas, siempre que el arreglo observableitems
no cambie.