Pular para o conteúdo principal

Values

Assim como Array, Values não tem tamanho limitado. A definição aqui descreve os tipos de valores esperados, com as chaves sendo qualquer string.

Descreve um mapa cujos valores seguem o schema fornecido.

  • definition: obrigatório Um schema único que este array contém ou um mapeamento de schema para valores de atributo.
  • schemaAttribute: opcional (obrigatório se definition não for um schema único) O atributo de cada entity encontrada que define qual schema, conforme o mapeamento da definition, usar ao normalizar. Pode ser uma string ou uma função. Se for uma função, aceita os seguintes argumentos:
    • value: O valor de entrada da entity.
    • parent: O objeto pai do array de entrada.
    • key: A chave sob a qual o array de entrada aparece no objeto pai.
dica

Torne-o mutável (novos itens podem ser atribuídos) com Collections

Métodos de instância​

  • define(definition): Quando usado, a definition informada será mesclada com a definition original passada ao constructor de Values. Este método tende a ser útil para criar referências circulares no schema.
Nomenclatura

Values recebeu esse nome por causa de Object.values(), pois seus schemas são usados para os valores de um Object.

Uso​

Fixtures
GET /items
{"firstThing":{"id":1},"secondThing":{"id":2}}
▶ItemPage.tsx
import { Entity, RestEndpoint, Values } from '@data-client/rest';
import { useSuspense } from '@data-client/react';

export class Item extends Entity {
  id = 0;
}
export const getItems = new RestEndpoint({
  path: '/items',
  schema: new Values(Item),
});
function ItemPage() {
  const items = useSuspense(getItems);
  return <pre>{JSON.stringify(items, undefined, 2)}</pre>;
}
render(<ItemPage />);
Resultado
Store▶

Atualizando muitas entities​

Use Values com Controller.set() para gravar muitas entities em uma única atualização do store, sem um endpoint.

ctrl.set(getItems.schema, {
firstThing: { id: 1 },
secondThing: { id: 2 },
});

Tipos polimórficos​

Se seus dados de entrada são um objeto com valores de mais de um tipo de entity, mas cujo schema não é facilmente definido pela chave, você pode usar um mapeamento de schema, de forma muito parecida com Union e schema.Array.

observação

Se seus dados retornarem um objeto para o qual você não forneceu um mapeamento, o objeto original será retornado no resultado e uma entity não será criada.

string schemaAttribute​

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, Values } 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 Values(
    {
      link: Link,
      post: Post,
    },
    'type',
  ),
});
▶FeedList
Resultado
Store▶

function schemaAttribute​

Os valores retornados devem corresponder a uma chave na definition. Aqui mostraremos o mesmo comportamento do caso 'string', exceto que acrescentaremos um 's'.

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, Values } 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 Values(
    {
      links: Link,
      posts: Post,
    },
    (input: Link | Post, parent: unknown, key: string) => `${input.type}s`,
  ),
});
▶FeedList
Resultado
Store▶