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 sedefinitionnã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.
Torne-o mutável (novos itens podem ser atribuídos) com Collections
Métodos de instância
define(definition): Quando usado, adefinitioninformada será mesclada com a definition original passada ao constructor deValues. Este método tende a ser útil para criar referências circulares no schema.
Values recebeu esse nome por causa de Object.values(), pois
seus schemas são usados para os valores de um Object.
Uso
{"firstThing":{"id":1},"secondThing":{"id":2}}
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 />);
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.
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
[{"id":1,"type":"link","url":"https://ntucker.true.io","title":"Nate site"},{"id":10,"type":"post","content":"good day!"}]
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', ), });
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'.
[{"id":1,"type":"link","url":"https://ntucker.true.io","title":"Nate site"},{"id":10,"type":"post","content":"good day!"}]
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`, ), });