Saltar al contenido principal

All

Obtiene todas las entities de la caché como un Array.

  • definition: obligatorio Una única Entity que contiene este array o una asociación de valores de atributo a Entities.
  • schemaAttribute: opcional (obligatorio si definition no es un schema único) El atributo de cada entity encontrada que define qué schema, según la asociación de definiciones, se usará al normalizar. Puede ser un string o una función. Si se le da una función, acepta los siguientes argumentos: _ value: El valor de entrada de la entity. _ parent: El objeto padre del array de entrada. * key: La clave con la que el array de entrada aparece en el objeto padre.

Métodos de instancia​

  • define(definition): Al usarse, la definition recibida se combinará con la definición original pasada al constructor de All. Este método suele ser útil para crear referencias circulares en el schema.

Uso​

Para describir un array simple de un único tipo de entity:

Fixtures
GET /users
[{"id":"123","name":"Jim"},{"id":"456","name":"Jane"}]
POST /users
{"id":"777","name":"ABC"}
▶api/User
▶NewUser
▶UsersPage.tsx
import { RestEndpoint, All } from '@data-client/rest';
import { useSuspense } from '@data-client/react';
import { User } from './api/User';
import NewUser from './NewUser';

const getUsers = new RestEndpoint({
  path: '/users',
  schema: new All(User),
});

function UsersPage() {
  const users = useSuspense(getUsers);
  return (
    <div>
      {users.map(user => (
        <div key={user.pk()}>{user.name}</div>
      ))}
      <NewUser />
    </div>
  );
}
render(<UsersPage />);
Resultado
Store▶

Tipos polimórficos​

Si tus datos de entrada son un array con más de un tipo de entity, es necesario definir una asociación de schemas.

nota

Si tus datos devuelven un objeto para el que no proporcionaste una asociación, el objeto original se devolverá en el resultado y no se creará una entity.

schemaAttribute de tipo string​

Fixtures
GET /feed
[{"id":1,"type":"link","url":"https://ntucker.true.io","title":"Nate site"},{"id":10,"type":"post","content":"good day!"}]
▶api/Feed
import { Entity, RestEndpoint, All } from '@data-client/rest';

export abstract class FeedItem extends Entity {
  readonly id: number = 0;
  declare readonly type: 'link' | 'post';
}
export class Link extends FeedItem {
  readonly type = 'link' as const;
  readonly url: string = '';
  readonly title: string = '';
}
export class Post extends FeedItem {
  readonly type = 'post' as const;
  readonly content: string = '';
}
export const getFeed = new RestEndpoint({
  path: '/feed',
  schema: new All(
    {
      link: Link,
      post: Post,
    },
    'type',
  ),
});
▶FeedList
Resultado
Store▶

schemaAttribute de tipo función​

Los valores devueltos deben coincidir con una clave de definition. Aquí mostraremos el mismo comportamiento que en el caso de 'string', salvo que añadiremos una 's' al final.

Fixtures
GET /feed
[{"id":1,"type":"link","url":"https://ntucker.true.io","title":"Nate site"},{"id":10,"type":"post","content":"good day!"}]
▶api/Feed
import { Entity, RestEndpoint, All } from '@data-client/rest';

export abstract class FeedItem extends Entity {
  readonly id: number = 0;
  declare readonly type: 'link' | 'post';
}
export class Link extends FeedItem {
  readonly type = 'link' as const;
  readonly url: string = '';
  readonly title: string = '';
}
export class Post extends FeedItem {
  readonly type = 'post' as const;
  readonly content: string = '';
}
export const getFeed = new RestEndpoint({
  path: '/feed',
  schema: new All(
    {
      links: Link,
      posts: Post,
    },
    (input: Link | Post, parent: unknown, key: string) => `${input.type}s`,
  ),
});
▶FeedList
Resultado
Store▶