Introdução
Com a chegada dos Signals, o Angular passou a oferecer uma nova forma de gerenciar estado.
O Signal Store, disponibilizado pelo NgRx, surge como uma alternativa moderna para gerenciamento de estado compartilhado, aproveitando toda a reatividade dos Signals.
Objetivos de aprendizagem
- Explicar quando uma Signal Store agrega valor ao estado compartilhado.
- Separar estado, seletores computados e métodos de atualização.
- Comparar Signal Store, serviço com Signals e NgRx tradicional.
O que é Signal Store?
Qual problema ela resolve?
Imagine uma tela composta por:
CustomerPage
├── SearchComponent
├── FiltersComponent
├── CustomerTableComponent
├── PaginationComponent
└── LoadingIndicatorComponentTodos esses componentes precisam compartilhar:
- Lista de clientes
- Filtros
- Estado de carregamento
- PaginaçãoSem uma Store, o estado pode acabar sendo propagado através de Inputs e Outputs.
Com Signal Store, todos os componentes acessam a mesma fonte de verdade.
Criando uma Store
Exemplo simples:
import { signalStore, withState } from "@ngrx/signals";
interface CustomerState {
customers: Customer[];
loading: boolean;
search: string;
}
const initialState: CustomerState = {
customers: [],
loading: false,
search: "",
};
export const CustomerStore = signalStore(withState(initialState));Agora a Store passa a possuir estado reativo compartilhado.
Atualizando Estado
Podemos alterar informações utilizando patchState.
import { patchState } from "@ngrx/signals";
patchState(store, {
loading: true,
});Atualizando um valor:
patchState(store, {
search: "André",
});Computed State
Assim como Signals normais, podemos derivar valores.
import { computed } from "@angular/core";
import { withComputed } from "@ngrx/signals";
withComputed((store) => ({
totalCustomers: computed(() => store.customers().length),
}));O valor será recalculado automaticamente quando a lista mudar.
Métodos
Também podemos encapsular regras de negócio.
import { patchState, withMethods } from "@ngrx/signals";
withMethods((store) => ({
setLoading() {
patchState(store, {
loading: true,
});
},
clearLoading() {
patchState(store, {
loading: false,
});
},
}));Isso ajuda a evitar alterações espalhadas pela aplicação.
Integração com HTTP
Um cenário comum:
loadCustomers() {
this.http
.get<Customer[]>("/api/customers")
.subscribe(customers => {
patchState(this.store, {
customers
});
});
}O estado fica centralizado e os componentes apenas consomem os Signals.
Signal Store vs Service
| Aspecto | Service | Signal Store |
|---|---|---|
| Compartilhamento de estado | Limitado | Excelente |
| Estado reativo | Manual | Nativo |
| Computed state | Manual | Nativo |
| Escalabilidade | Média | Alta |
| Integração com Signals | Parcial | Completa |
Signal Store vs NgRx Store Tradicional
| Aspecto | NgRx Store | Signal Store |
|---|---|---|
| Actions | Sim | Não obrigatório |
| Reducers | Sim | Não |
| Boilerplate | Alto | Baixo |
| Curva de aprendizado | Maior | Menor |
| Baseado em Signals | Não | Sim |
Quando usar?
Quando NÃO usar?
Caso real de entrevista
Imagine:
CustomerPage
├── Search
├── Filters
├── Table
├── Pagination
└── LoadingTodos precisam reagir às mudanças de busca.
Uma abordagem moderna seria:
CustomerStore
├── customers
├── search
├── loading
├── pagination
└── filtersTodos os componentes observam a mesma Store.
Perguntas técnicas
O que é Signal Store?
Quando usar Signal Store em vez de Signals simples?
Signal Store substitui NgRx?
Qual a principal vantagem da Signal Store?
Conclusão
Signal Store centraliza estado compartilhado com a reatividade dos Signals e pode reduzir boilerplate. A comparação com o NgRx tradicional depende da complexidade e das necessidades de cada aplicação.
Verifique seu entendimento
Quando uma Signal Store tende a ser uma escolha proporcional?
Resposta: Quando estado compartilhado exige atualizações e derivados organizados. A store ajuda quando há estado compartilhado e regras de atualização; estado estritamente local pode continuar no componente.
Revisão do artigo
Pontos principais
- — Signal Store organiza estado, derivados e operações em uma API coesa.
- — Estado computado evita duplicação e sincronização manual.
- — A escolha depende da abrangência e complexidade do estado.