1. Arquitectura escalable de datos.
2. Mayor control en el flujo de datos.
3. Programación Funcional.
4. Control de estados.
5. Estado global e immutable
Implementar el patrón Redux en Angular con Ngrx entiendo los tres principios claves de redux: El store como única fuente de la verdad, el state es solo de modo lectura y los cambios solo lo harán funciones puras (reducers) por medio de actions.
Computador personal.
Editor de código. (Recomendado VSCode)
Chrome
NodeJS
Angular CLI
Clase 1: ¿Qué es Redux?
Clase 2: Ideas clave de Redux
Clase 3: Redux + Angular
Clase 4: Proyecto (RedditApp)
Clase 5: Proyecto (RedditApp)
Controlar el estado
- Respuestas del servidor
- Datos en cache
- Datos locales
- Estados de la UI
"En cierto punto, ya no se entiende que esta pasando en la aplicación ya que perdiste control sobre el cuándo, el por qué y el cómo de su estado"
Redux intenta hacer predecibles las mutaciones del estado
- Store = La única fuente de la verdad
- Actions = El estado es de solo lectura
- Reducers = Los cambios los realizan acciones puras
RX = manejar la complejidad de aplicaciones asíncronas
Redux puede ser descrito en tres principios fundamentales
El estado de toda tu aplicación esta almacenado en un árbol guardado en un único store.
https://css-tricks.com/learning-react-redux/
{
todos: [{
text: 'Aprender redux',
completed: true
}, {
text: 'Visitar nicobytes.com',
completed: false
}],
visibilityFilter: 'SHOW_COMPLETED'
}
La única forma de modificar el estado es emitiendo una acción, un objeto describiendo que ocurrió.
{ type: 'ADD_TODO', text: 'Ir a nadar a la piscina' }
{ type: 'TOGGLE_TODO', index: 1 }
{ type: 'SET_VISIBILITY_FILTER', filter: 'SHOW_ALL' }
store.dispatch({
type: 'COMPLETE_TODO',
index: 1
});
store.dispatch({
type: 'SET_VISIBILITY_FILTER',
filter: 'SHOW_COMPLETED'
});
https://css-tricks.com/learning-react-redux/
Para especificar como el árbol de estado es transformado por las acciones, se utilizan reducers puros.
ng new counter-app-ngrx
npm install @ngrx/store --save
www.devcode.la
https://github.com/EscuelaIt/redux-angular
mkdir redux-angular
{
"name": "angular-redux",
"version": "1.0.0",
"description": "",
"author": "",
"license": "MIT",
"devDependencies": {
"ts-node": "3.3.0",
"typescript": "2.6.1"
},
"dependencies": {
"redux": "3.7.2"
}
}
{
"compilerOptions": {
"target": "es5",
"module": "commonjs",
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"noEmitHelpers": true,
"sourceMap": true,
"lib": [
"es2016",
"dom"
]
},
"compileOnSave": false,
"buildOnSave": false
}
1. npm install
2. crear index.ts
3. ./node_modules/.bin/ts-node index.ts
class Store<T>{
private state:T;
constructor(
private reducer: Reducer<T>,
initState: T
){
this.state = initState;
}
}
let reducer: Reducer<number> = (state: number = 0, action: Action) =>{
if(action === null) return state;
switch(action.type){
case 'INCREMENT':
return state + 1;
case 'DECREMENT':
return state - 1;
case 'PLUS':
return state + (<PlusAction>action).payload;
default:
return state;
}
}
import { Action } from '@ngrx/store';
export const INCREMENT = '[Counter] increment';
export const DECREMENT = '[Counter] decrement';
export const PLUS = '[Counter] plus';
export const RESET = '[Counter] reset';
export interface PlusAction extends Action{
payload: number;
}
export interface AppState{
counter: number;
}
StoreModule.forRoot(rootReducer),
StoreModule.forRoot(rootReducer),
this.store.select()
export const rootReducer: ActionReducerMap<AppState> = {
todos: TodosReducer,
filter: FilterReducer
};
export class NameAction implements Action {
readonly type = NAME_TODO;
constructor(
public payload: string
) {}
}
ng new tasks-angular-redux --sytle scss
npm install todomvc-common --save
npm install todomvc-app-css --save
npm install todomvc-common --save
npm install todomvc-app-css --save
@import '~todomvc-common/base.css';
@import '~todomvc-app-css/index.css';
- Effects
- REST API