Pular para o conteúdo
Skillpedia
Sites e telas (frontend)280 mil · #58

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.

O que ela faz

Este guia ensina padrões de desenvolvimento para criar interfaces de usuário modernas e eficientes usando React e Next.js. Ele mostra como organizar o código, gerenciar dados e otimizar a velocidade das aplicações.

Quando usar

  • ✓Ao criar partes visuais de um site (componentes).
  • ✓Ao gerenciar informações que mudam na tela.
  • ✓Ao melhorar a velocidade de carregamento e a performance.

Exemplo do que pedir para a IA

“Como posso organizar melhor o código dos meus botões em React?”

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

https://github.com/affaan-m/ECC/blob/main/pi/core/skills/frontend-patterns/SKILL.md

Mensagem pronta para colar

Use esta skill para me ajudar: https://github.com/affaan-m/ECC/blob/main/pi/core/skills/frontend-patterns/SKILL.md Leia o arquivo SKILL.md desse link e siga as instruções dele na minha tarefa.
Como funciona

Ele fornece exemplos de código e explicações sobre como usar técnicas como 'Composição sobre Herança' e 'Componentes Compostos'. Isso ajuda a construir interfaces de forma mais flexível e reutilizável.

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 affaan-m/ECC --skill frontend-patterns

Ou baixe só o arquivo:

curl -L https://raw.githubusercontent.com/affaan-m/ECC/main/pi/core/skills/frontend-patterns/SKILL.md -o SKILL.md
Conteú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 Desenvolvimento Frontend

Padrões modernos de frontend para React, Next.js e interfaces de usuário de alto desempenho.

Quando Ativar

  • Construindo componentes React (composição, props, renderização)
  • Gerenciando estado (useState, useReducer, Zustand, Context)
  • Implementando busca de dados (SWR, React Query, componentes de servidor)
  • Otimizando desempenho (memoização, virtualização, divisão de código)
  • Trabalhando com formulários (validação, inputs controlados, esquemas Zod)
  • Lidando com roteamento e navegação no lado do cliente
  • Construindo padrões de UI acessíveis e responsivos

Padrões de Componentes

Composição Sobre Herança

// PASS: GOOD: Component composition
interface CardProps {
  children: React.ReactNode
  variant?: 'default' | 'outlined'
}

export function Card({ children, variant = 'default' }: CardProps) {
  return <div className={`card card-${variant}`}>{children}</div>
}

export function CardHeader({ children }: { children: React.ReactNode }) {
  return <div className="card-header">{children}</div>
}

export function CardBody({ children }: { children: React.ReactNode }) {
  return <div className="card-body">{children}</div>
}

// Usage
<Card>
  <CardHeader>Title</CardHeader>
  <CardBody>Content</CardBody>
</Card>

Componentes Compostos

interface TabsContextValue {
  activeTab: string
  setActiveTab: (tab: string) => void
}

const TabsContext = createContext<TabsContextValue | undefined>(undefined)

export function Tabs({ children, defaultTab }: {
  children: React.ReactNode
  defaultTab: string
}) {
  const [activeTab, setActiveTab] = useState(defaultTab)

  return (
    <TabsContext.Provider value={{ activeTab, setActiveTab }}>
      {children}
    </TabsContext.Provider>
  )
}

export function TabList({ children }: { children: React.ReactNode }) {
  return <div className="tab-list">{children}</div>
}

export function Tab({ id, children }: { id: string, children: React.ReactNode }) {
  const context = useContext(TabsContext)
  if (!context) throw new Error('Tab must be used within Tabs')

  return (
    <button
      className={context.activeTab === id ? 'active' : ''}
      onClick={() => context.setActiveTab(id)}
    >
      {children}
    </button>
  )
}

// Usage
<Tabs defaultTab="overview">
  <TabList>
    <Tab id="overview">Overview</Tab>
    <Tab id="details">Details</Tab>
  </TabList>
</Tabs>

Padrão Render Props

interface DataLoaderProps<T> {
  url: string
  children: (data: T | null, loading: boolean, error: Error | null) => React.ReactNode
}

export function DataLoader<T>({ url, children }: DataLoaderProps<T>) {
  const [data, setData] = useState<T | null>(null)
  const [loading, setLoading] = useState(true)
  const [error, setError] = useState<Error | null>(null)

  useEffect(() => {
    fetch(url)
      .then(res => res.json())
      .then(setData)
      .catch(setError)
      .finally(() => setLoading(false))
  }, [url])

  return <>{children(data, loading, error)}</>
}

// Usage
<DataLoader<Market[]> url="/api/markets">
  {(markets, loading, error) => {
    if (loading) return <Spinner />
    if (error) return <Error error={error} />
    return <MarketList markets={markets!} />
  }}
</DataLoader>

Padrões de Hooks Personalizados

Hook de Gerenciamento de Estado

export function useToggle(initialValue = false): [boolean, () => void] {
  const [value, setValue] = useState(initialValue)

  const toggle = useCallback(() => {
    setValue(v => !v)
  }, [])

  return [value, toggle]
}

// Usage
const [isOpen, toggleOpen] = useToggle()

Hook de Busca de Dados Assíncronos

interface UseQueryOptions<T> {
  onSuccess?: (data: T) => void
  onError?: (error: Error) => void
  enabled?: boolean
}

export function useQuery<T>(
  key: string,
  fetcher: () => Promise<T>,
  options?: UseQueryOptions<T>
) {
  const [data, setData] = useState<T | null>(null)
  const [error, setError] = useState<Error | null>(null)
  const [loading, setLoading] = useState(false)

  // Mantém o último fetcher/options em refs para que refetch permaneça referencialmente
  // estável mesmo quando os chamadores passam funções inline e literais de objeto.
  // Sem isso, cada renderização cria um novo refetch, e o efeito abaixo
  // é executado novamente após cada atualização de estado - um loop de busca infinito.
  const fetcherRef = useRef(fetcher)
  const optionsRef = useRef(options)
  useEffect(() => {
    fetcherRef.current = fetcher
    optionsRef.current = options
  })

  const refetch = useCallback(async () => {

…
Perguntas frequentes

O que são 'padrões' em desenvolvimento?

Padrões são soluções comprovadas para problemas comuns no desenvolvimento de software. Eles ajudam a escrever código mais organizado, fácil de entender e manter.

O que é React e Next.js?

React e Next.js são ferramentas populares para criar interfaces de usuário na web. Eles ajudam a construir sites e aplicações de forma eficiente.

Por que otimizar a performance é importante?

Otimizar a performance significa fazer com que o site ou aplicação carregue mais rápido e funcione sem travamentos, o que melhora a experiência do usuário.

Detalhes

Descrição original do autor

Frontend development patterns for React, Next.js, state management, performance optimization, and UI best practices. Use when building or reviewing React or Next.js components, state, or render performance.

repo: affaan-m/ECC

Popularidade

Estrelas no GitHub
280 mil
Posição no ranking
#58
Licença
MIT
Atualizada em
15/10/2026

Essa skill é útil?

0

Entre para votar.

Comentários

  • …

Mais skills deste repositório

Skills parecidas