react-ui-patterns
Ajuda seu agente a criar interfaces de usuário reativas em React. Ele gerencia estados de carregamento, erros e dados de forma eficiente para uma melhor experiência.
O que ela faz
Este código ajuda a criar interfaces de usuário (telas de aplicativos) mais claras e responsivas. Ele garante que os usuários vejam indicadores de carregamento apenas quando necessário, que erros sejam sempre mostrados e que os botões não possam ser clicados várias vezes seguidas.
Quando usar
- ✓Ao criar novas telas ou componentes em um aplicativo.
- ✓Quando o aplicativo precisa buscar ou enviar dados.
- ✓Para garantir que os botões e formulários se comportem corretamente.
Exemplo do que pedir para a IA
“Como posso garantir que o usuário saiba quando algo está carregando ou falhou?”
Quer saber mais? Abra as seções abaixo.
Como usar
O jeito mais fácil: copie a mensagem abaixo e cole no Claude, ChatGPT, Cursor ou outra IA. Ela lê a skill e segue as instruções.
Link da skill
Mensagem pronta para colar
Como funciona
O código define regras para mostrar mensagens de 'carregando' ou 'erro' apenas quando apropriado. Ele também desabilita botões enquanto uma ação está em andamento para evitar problemas.
Instalação
Jeito mais fácil: copie o link da skill e cole no Claude, ChatGPT ou Cursor pedindo para seguir as instruções.
No terminal (Claude Code, Codex, Cursor), na pasta do projeto:
npx skills add sickn33/agentic-awesome-skills --skill react-ui-patternsOu baixe só o arquivo:
curl -L https://raw.githubusercontent.com/sickn33/agentic-awesome-skills/main/plugins/agentic-awesome-skills-claude/skills/react-ui-patterns/SKILL.md -o SKILL.mdConteúdo técnico (SKILL.md)
Tradução do texto original do autor no GitHub. Os comandos e códigos estão como no original.
Padrões de UI em React
Princípios Fundamentais
- Nunca mostre UI desatualizada - Indicadores de carregamento apenas quando estiver realmente carregando
- Sempre exiba erros - Usuários precisam saber quando algo falha
- Atualizações otimistas - Faça a UI parecer instantânea
- Divulgação progressiva - Mostre o conteúdo conforme ele fica disponível
- Degradação graciosa - Dados parciais são melhores que nenhum dado
Padrões de Estado de Carregamento
A Regra de Ouro
Mostre o indicador de carregamento APENAS quando não houver dados para exibir.
// CORRECT - Only show loading when no data exists
const { data, loading, error } = useGetItemsQuery();
if (error) return <ErrorState error={error} onRetry={refetch} />;
if (loading && !data) return <LoadingState />;
if (!data?.items.length) return <EmptyState />;
return <ItemList items={data.items} />;
// WRONG - Shows spinner even when we have cached data
if (loading) return <LoadingState />; // Flashes on refetch!
Árvore de Decisão de Estado de Carregamento
Is there an error?
→ Yes: Show error state with retry option
→ No: Continue
Is it loading AND we have no data?
→ Yes: Show loading indicator (spinner/skeleton)
→ No: Continue
Do we have data?
→ Yes, with items: Show the data
→ Yes, but empty: Show empty state
→ No: Show loading (fallback)
Esqueleto vs. Spinner
| Use Esqueleto Quando | Use Spinner Quando |
|---|---|
| Formato de conteúdo conhecido | Formato de conteúdo desconhecido |
| Layouts de lista/cartão | Ações de modal |
| Carregamento inicial da página | Submissões de botão |
| Marcadores de posição de conteúdo | Operações em linha |
Padrões de Tratamento de Erros
Hierarquia de Tratamento de Erros
1. Inline error (field-level) → Form validation errors
2. Toast notification → Recoverable errors, user can retry
3. Error banner → Page-level errors, data still partially usable
4. Full error screen → Unrecoverable, needs user action
Sempre Mostre Erros
CRÍTICO: Nunca ignore erros silenciosamente.
// CORRECT - Error always surfaced to user
const [createItem, { loading }] = useCreateItemMutation({
onCompleted: () => {
toast.success({ title: 'Item created' });
},
onError: (error) => {
console.error('createItem failed:', error);
toast.error({ title: 'Failed to create item' });
},
});
// WRONG - Error silently caught, user has no idea
const [createItem] = useCreateItemMutation({
onError: (error) => {
console.error(error); // User sees nothing!
},
});
Padrão de Componente de Estado de Erro
interface ErrorStateProps {
error: Error;
onRetry?: () => void;
title?: string;
}
const ErrorState = ({ error, onRetry, title }: ErrorStateProps) => (
<div className="error-state">
<Icon name="exclamation-circle" />
<h3>{title ?? 'Something went wrong'}</h3>
<p>{error.message}</p>
{onRetry && (
<Button onClick={onRetry}>Try Again</Button>
)}
</div>
);
Padrões de Estado de Botão
Estado de Carregamento do Botão
<Button
onClick={handleSubmit}
isLoading={isSubmitting}
disabled={!isValid || isSubmitting}
>
Submit
</Button>
Desabilite Durante Operações
CRÍTICO: Sempre desabilite gatilhos durante operações assíncronas.
// CORRECT - Button disabled while loading
<Button
disabled={isSubmitting}
isLoading={isSubmitting}
onClick={handleSubmit}
>
Submit
</Button>
// WRONG - User can tap multiple times
<Button onClick={handleSubmit}>
{isSubmitting ? 'Submitting...' : 'Submit'}
</Button>
Estados Vazios
Requisitos de Estado Vazio
Toda lista/coleção DEVE ter um estado vazio:
// WRONG - No empty state
return <FlatList data={items} />;
// CORRECT - Explicit empty state
return (
<FlatList
data={items}
ListEmptyComponent={<EmptyState />}
/>
);
Estados Vazios Contextuais
// Search with no results
<EmptyState
icon="search"
title="No results found"
description="Try different search terms"
/>
// List with no items yet
<EmptyState
icon="plus-circle"
title="No items yet"
description="Create your first item"
action={{ label: 'Create Item', onClick: handleCreate }}
/>
Padrão de Submissão de Formulário
const MyForm = () => {
const [submit, { loading }] = useSubmitMutation({
onCompleted: handleSuccess,
onError: handleError,
});
const handleSubmit = async () => {
if (!isValid) {
toast.error({ title: 'Please fix errors' });
return;
}
await submit({ variables: { input: values } });
};
return (
<form>
…
Perguntas frequentes
O que é um 'estado de carregamento'?
É o que o usuário vê (como um círculo girando) enquanto o aplicativo busca informações ou realiza uma tarefa.
Por que é importante mostrar erros?
Para que o usuário entenda o que deu errado e possa tentar novamente ou saber que algo precisa de atenção.
O que são 'atualizações otimistas'?
É fazer a interface parecer que respondeu instantaneamente, mesmo que a ação ainda esteja sendo processada em segundo plano.
Detalhes
Descrição original do autor
Modern React UI patterns for loading states, error handling, and data fetching. Use when building UI components, handling async data, or managing UI states.
Popularidade
- Estrelas no GitHub
- 48 mil
- Posição no ranking
- #3969
- Licença
- MIT
- Atualizada em
- 15/10/2026
Comentários
- …
Mais skills deste repositório
00-andruia-consultant
Ajuda seu agente a iniciar ou melhorar projetos de IA. Ele analisa código, sugere ferramentas e cria planos de ação em espanhol.
sickn33/agentic-awesome-skills
007
Faz seu agente realizar auditorias de segurança e modelagem de ameaças. É útil para proteger projetos contra ataques e vulnerabilidades.
sickn33/agentic-awesome-skills
10-andruia-skill-smith
Ajuda seu agente a criar ou melhorar ferramentas de IA. Ele define como as ferramentas funcionam, escreve a documentação e valida a estrutura.
sickn33/agentic-awesome-skills
20-andruia-niche-intelligence
Faz seu agente criar um resumo sobre um setor específico. É útil para entender o contexto, regras, padrões de uso e riscos de um projeto, usando fontes confiáveis.
sickn33/agentic-awesome-skills
Skills parecidas
angular-developer
Ajuda seu agente a criar código Angular e a dar conselhos sobre a estrutura do projeto. É útil para iniciar novos projetos, criar partes do código ou melhorar a performance e acessibilidade.
affaan-m/ECC
frontend-a11y
Ajuda seu agente a tornar interfaces web acessíveis para todos. Ele garante que sites e apps funcionem bem com leitores de tela e navegação por teclado.
affaan-m/ECC
frontend-patterns
Faz seu agente aplicar padrões modernos no desenvolvimento frontend. Ele otimiza performance, gerencia estado e segue boas práticas em React e Next.js.
affaan-m/ECC