EdsonJunior._
Artigos

MVVM explicado: o que é, quando usar e como aplicar em React Native

10 de fevereiro de 2026 · 2 min de leitura

MVVM (Model-View-ViewModel) é um padrão que separa a interface da lógica de negócio.

O desafio da organização

Quando código de UI e regras de negócio ficam misturados, aparecem os mesmos problemas:

  • Dificuldade para testar e manter
  • Acoplamento entre tela e lógica
  • Retrabalho ao mudar a interface
  • Duplicação de código entre telas

Os três componentes

Cada um com uma responsabilidade clara:

CamadaResponsabilidade
ViewExibe dados e captura interações do usuário
ViewModelPrepara dados e comandos para a tela
ModelDados e regras de negócio do domínio

O fluxo é View ↔ ViewModel ↔ Model. O Model não conhece a View.

Model

A camada de dados e regras de negócio.

  • Estruturas de dados e entidades do domínio
  • Validações, cálculos e regras de negócio
  • Não conhece View nem ViewModel

View

A interface do usuário: o que ele vê e toca.

  • Telas e componentes (React Native, Flutter, Swift/Kotlin etc.)
  • Exibe dados expostos pelo ViewModel
  • Sem lógica de negócio, só apresentação e eventos

ViewModel

A ponte entre View e Model: estado e lógica da tela.

  • Transforma dados do Model para a View
  • Expõe propriedades e comandos (binding)
  • Lógica de apresentação, sem depender da UI

Como fica em React Native

Cada tela vira uma pasta pequena, com um arquivo para cada papel:

features/cart/
  index.tsx        // View: só renderiza
  viewModel.ts     // ViewModel: estado e handlers
  models.ts        // Model: tipos e regras
// models.ts
export type CartItem = { id: string; name: string; price: number; qty: number }

export const cartTotal = (items: CartItem[]) =>
  items.reduce((sum, i) => sum + i.price * i.qty, 0)
// viewModel.ts
import { useState } from 'react'
import { cartTotal, type CartItem } from './models'

export function useCartViewModel(initial: CartItem[]) {
  const [items, setItems] = useState(initial)

  const remove = (id: string) => setItems((prev) => prev.filter((i) => i.id !== id))

  return { items, total: cartTotal(items), remove }
}
// index.tsx
export default function CartScreen() {
  const { items, total, remove } = useCartViewModel(initialItems)
  return <CartList items={items} total={total} onRemove={remove} />
}

A View não sabe como o total é calculado. O ViewModel pode ser testado sem renderizar nada.

Por que usar MVVM

  • Testar a lógica de tela sem depender da interface
  • Redesenhar a UI sem quebrar regras de negócio
  • Design e backend evoluem em paralelo
  • Código mais reutilizável e manutenção mais simples

Onde usar

O padrão serve para mobile, web com estado complexo e desktop:

  • Mobile: Swift, Kotlin, React Native, Flutter
  • Web: Vue, React, Angular
  • Desktop: WPF, .NET MAUI, SwiftUI

Meu projeto precisa?

Considere MVVM quando:

  • Várias telas compartilham lógica e estado
  • Você quer testar lógica sem depender da UI
  • Design e backend evoluem em ritmos diferentes
  • O app tende a crescer, e a equipe também

Telas simples e estáticas podem dispensar o padrão.

Resumo

Model = dados e regras. View = o que o usuário vê. ViewModel = ponte e estado da tela. Separação clara, testes e manutenção mais fáceis.