Week 08 · Day 06 — NgRx:Reducer、Selector 與 Store
學習目標
- 用
createReducer/on處理 action - 用
createSelector讀取狀態 - 在元件用
Store的 dispatch / select
重點
Reducer(純函式變換狀態)
import { createReducer, on } from '@ngrx/store';
interface TodoState { todos: Todo[] }
const initialState: TodoState = { todos: [] };
export const todoReducer = createReducer(
initialState,
on(addTodo, (state, { todo }) => ({
...state,
todos: [...state.todos, todo]
})),
on(removeTodo, (state, { id }) => ({
...state,
todos: state.todos.filter(t => t.id !== id)
}))
);
Selector(選取狀態)
import { createSelector } from '@ngrx/store';
export interface AppState { todos: TodoState }
export const selectTodoState = (s: AppState) => s.todos;
export const selectTodos = createSelector(
selectTodoState,
(state: TodoState) => state.todos
);
在元件中使用 Store
@Component({ ... })
export class TodoComponent {
todos$ = this.store.select(selectTodos); // 訂閱
constructor(private store: Store) {}
addTodo(todo: Todo): void {
this.store.dispatch(addTodo({ todo })); // 發出 action
}
}
<ul>
<li *ngFor="let t of todos$ | async">{{ t.title }}</li>
</ul>
實作
- 建立
todo.reducer.ts(處理 add/remove) - 建立
selectors取得todos - 在元件用
store.dispatch與store.select
作業
- 用
createReducer+on實作 reducer - 用
createSelector選取狀態 - 元件用
store.dispatch/store.select操作