O que store-data-structures faz?
Padrões de estrutura de dados para stores Zustand do LobeHub. Use ao projetar estado de store, divisões lista/detalhe, mapas normalizados, reducers, messagesMap, topicsMap, ou ao escolher fontes de tipos compartilhadas.
Visão Geral
Este repositório contém padrões e convenções para modelar dados em stores Zustand dentro do ecossistema LobeHub. Ele fornece uma abordagem consistente para gerenciar estado, garantindo que as estruturas de dados sejam previsíveis, fáceis de manter e escaláveis.
Padrões Principais
Divisões Lista/Detalhe
Para gerenciar views de lista e detalhe, use um mapa normalizado para entidades e um array de IDs para a ordem da lista. Isso permite acesso rápido a entidades individuais e iteração eficiente sobre a lista.
interface StoreState {
entities: Record<string, Entity>;
listIds: string[];
selectedId: string | null;
}
Mapas Normalizados
Use mapas normalizados (Record<string, Entity>) para armazenar entidades. Isso evita duplicação e facilita atualizações.
interface NormalizedStore<T> {
byId: Record<string, T>;
allIds: string[];
}
Reducers
Implemente reducers como funções puras para atualizar o estado de forma imutável. Use um padrão de ação para acionar mudanças.
type Action =
| { type: 'ADD_ENTITY'; payload: Entity }
| { type: 'REMOVE_ENTITY'; payload: string };
function reducer(state: StoreState, action: Action): StoreState {
switch (action.type) {
case 'ADD_ENTITY':
return {
...state,
entities: { ...state.entities, [action.payload.id]: action.payload },
listIds: [...state.listIds, action.payload.id],
};
case 'REMOVE_ENTITY':
const { [action.payload]: _, ...rest } = state.entities;
return {
...state,
entities: rest,
listIds: state.listIds.filter(id => id !== action.payload),
};
default:
return state;
}
}
MessagesMap e TopicsMap
Para gerenciar mensagens e tópicos, use estruturas dedicadas:
interface MessagesMap {
byId: Record<string, Message>;
byTopic: Record<string, string[]>; // topicId -> messageIds
}
interface TopicsMap {
byId: Record<string, Topic>;
byParent: Record<string, string[]>; // parentTopicId -> topicIds
}
Fontes de Tipos Compartilhadas
Defina tipos compartilhados em um arquivo central, como types.ts, e importe-os conforme necessário. Isso garante consistência e facilita refatorações.
Plataformas Suportadas
- Aplicações baseadas em React
- Zustand (gerenciamento de estado)
- Ecossistema LobeHub
Como Usar
- Escolha um pattern com base na complexidade dos dados.
- Defina os tipos no arquivo de tipos compartilhados.
- Implemente a store usando Zustand, seguindo os patterns acima.
- Use os reducers para gerenciar mutações de estado.