Propiedades calculadas
Cálculos singulares
Las clases Entity son clases normales, así que cualquier dato derivado común puede añadirse simplemente como getters de la propia clase.
import { All, Entity, Query } from '@data-client/rest';
class User extends Entity {
id = '';
firstName = '';
lastName = '';
username = '';
email = '';
get fullName() {
return `${this.firstName} ${this.lastName}`;
}
static key = 'User';
}
Si los cálculos son costosos, siéntete libre de añadir algo de memoización.
import { All, Entity, Query } from '@data-client/rest';
import memoize from 'nano-memoize';
class User extends Entity {
truelyExpensiveValue = memoize(() => {
// compute that expensive thing!
});
}
consejo
Si simplemente quieres deserializar un campo a una forma más útil, como Temporal.Instant o BigNumber, puedes usar el static schema declarativo.
import { All, Entity, Query } from '@data-client/rest';
import BigNumber from 'bignumber.js';
class User extends Entity {
id = '';
firstName = '';
lastName = '';
createdAt = Temporal.Instant.fromEpochMilliseconds(0);
lifetimeBlinkCount = BigNumber(0);
static key = 'User';
static schema = {
createdAt: Temporal.Instant.from,
lifetimeBlinkCount: BigNumber,
};
}
Cálculos globales
Query puede usarse para calcular datos derivados a partir de más de una entity. Generalmente llamamos a estos cálculos agregados.
resources/User
UsersPage
import { All, Query, schema } from '@data-client/rest'; import { useQuery, useSuspense } from '@data-client/react'; import { UserResource, User } from './resources/User'; const getUserCount = new Query( new All(User), (entries, { isAdmin } = {}) => { if (isAdmin !== undefined) return entries.filter(user => user.isAdmin === isAdmin).length; return entries.length; }, ); function UsersPage() { useSuspense(UserResource.getList); const userCount = useQuery(getUserCount); const adminCount = useQuery(getUserCount, { isAdmin: true }); // this should never happen since we suspense but typescript does not know that if (userCount === undefined) return null; return ( <div> <div>Total users: {userCount}</div> <div>Total admins: {adminCount}</div> </div> ); } render(<UsersPage />);
Resultado
Store▶