从服务中获取数据,然后在组件中渲染数据,通过组件树从上到下传递所有值。使用Angular默认的变更检测机制,每当有任一组件变化时,都会检测整个组件树。
Redux:一种现今十分流行的数据结构。其最大优点可能是它的简单性。如果把Redux剥离的只剩核心代码,其代码行数将不到100行。 Redux Primer-Flux:单向流
常用方法:createStore subscribe dispatch getState - createStore: 创建一个store的实例对象; - getState: 返回当前的state变量; - dispatch: 接收一个action并把它传给reducer,然后用reducer的返回值来更新state变量的值。注意,该方法没有返回值,是一种“触发并忘记”的策略; - subscribe: 用此方法来注册一个监听函数;当dispatch被调用时,我们遍历所有的监听器并逐个调用它们,它们会负责通知大家这 个state发生了变化。 返回一个unsubscribe函数。
小例子:
//定义store类 class Store<T> { private _state: T; private _listeners: ListenerCallback[] = []; constructor( private reducer: Reducer<T>, initialState: T ) { this._state = initialState; } getState(): T { return this._state; } dispatch(action: Action): void { this._state = this.reducer(this._state, action); this._listeners.forEach((listener: ListenerCallback) => listener()); } subscribe(listener: ListenerCallback): UnsubscribeCallback { this._listeners.push(listener); return () => { // returns an "unsubscribe" function this._listeners = this._listeners.filter(l => l !== listener); }; } } //使用store类 let store = new Store<number>(reducer, 0); console.log(store.getState()); // -> 0 // subscribe let unsubscribe = store.subscribe(() => { console.log('subscribed: ', store.getState()); }); store.dispatch({ type: 'INCREMENT' }); // -> subscribed: 1 store.dispatch({ type: 'INCREMENT' }); // -> subscribed: 2 unsubscribe(); store.dispatch({ type: 'DECREMENT' }); // (nothing logged) // decrement happened, even though we weren't listening for it console.log(store.getState()); // -> 1provideStore 提供给我们一个应用存储在应用的生命周期中使用。
action creators:用于创建action的函数。因为直接使用action做为参数时,dispatch语句都不够优雅,原因有以下两点:
不再需要手动转换相应的Action类型。如果终决定要改变payload的格式,我们不用更新任何一处dispatch 语句。一个简单的actionCreator函数:
updateName(name: string): Action { return { type: "UPDATE_NAME", payload: name }; } // usage this.store.dispatch(updateName("oren"))生成新的state通常有四种操作:
往数组中添加一项 array.concat()从数组中移除一项 array.slice()添加对象中的键或修改对象中某些键的值 Object.assign({}, state, { name: action.payload })从对象中移除键 Object.assign({},{logged_in:false,name:''}) javascript array方法一个reducer实例:
export function user (state = {}, action: Action):ActionReducer<IUser> { switch (action.type) { case "UPDATE_NAME": return Object.assign({}, state, { name: action.payload }); case "LOG_OUT": return Object.assign({}, { logged_in: false, name: '' }); default: return state; }