ホームページ > 記事 > ウェブフロントエンド > Angular での状態管理に ngrx/store を使用する
ngrx/store は Redux からインスピレーションを受けており、RxJS と統合された Angular 状態管理ライブラリであり、Angular エバンジェリストの Rob Wormald によって開発されました。 Redux と同じ基本的な考え方を持っていますが、RxJS を使用してオブザーバー パターンを実装します。 Redux の核となる原則に従いますが、Angular 専用に設計されています。
Angular の状態管理のほとんどはサービスによって引き継がれます。一部の中規模および大規模プロジェクトでは、これによる欠点が明らかになります。その 1 つは、状態の流れが混沌としており、役に立たないことです。その後、redux の状態管理モデルを利用し、rxjs フロー プログラミングの特性と組み合わせて、Angular の状態管理ツールである @ngrx/store を形成します。チュートリアル: "
Angular チュートリアル>>StoreModule:
{
type:'add',
payload:{name:'111'} }
)
アクションをリデューサーに分散するために使用されるタイプ。
#@NgRx/Store 状態管理の 3 原則
state ={ application:'angular app', shoppingList:['apple', 'pear'] }
state は読み取り専用です (状態は読み取り専用です)。読み取り専用形式のみ)
state={'username':'kat'}, //用户重新登录别的账户为tom state.username = 'tom' //在ngrx store 这个行为是绝对不允许的
function reducer(state = 'SHOW_ALL', action) { switch (action.type) { case 'SET_VISIBILITY_FILTER': return Object.assign({}, state ,newObj); default: return state } }
1. @ngrx/store をインストール
//下面是使用接口的情况, 更规范 export interface TaskList { id: number; text: string; complete: boolean; } export const TASKSAll: TaskList[] = [ {id: 1, text: 'Java Article 1', complete: false}, {id: 2, text: 'Java Article 2', complete: false} ] export interface AppState { count: number; todos: TaskList; // 如果要管理多个状态,在这个接口中添加即可 } //这个是不用接口的情况 // export interface AppState { // count: number; // todos: any; // // 如果要管理多个状态,在这个接口中添加即可 // }reducer
// reducer.ts,一般需要将state,action,reducer进行文件拆分 import { Action } from '@ngrx/store'; export const INCREMENT = 'INCREMENT'; export const DECREMENT = 'DECREMENT'; export const RESET = 'RESET'; const initialState = 0; // reducer定义了action被派发时state的具体改变方式 export function counterReducer(state: number = initialState, action: Action) { switch (action.type) { case INCREMENT: return state + 1; case DECREMENT: return state - 1; case RESET: return 0; default: return state; } }actions
アクションを個別に抽出する必要がある場合は、次を参照してください。 5 アクションを分離したい場合はどうすればよいですか?
3.store
ルート モジュールを登録します:
import { NgModule } from '@angular/core'; import { StoreModule } from '@ngrx/store'; // StoreModule: StoreModule是@ngrx/storeAPI中的一个模块, // 它被用来在应用模块中配置reducer。 import {counterReducer} from './store/reducer'; @NgModule({ imports: [ StoreModule.forRoot({ count: counterReducer }), // 注册store ], }) export class AppModule {}
を使用するか、使用するためにストアにサービスを挿入します。
// 组件级别 import { Component } from '@angular/core'; import { Store, select } from '@ngrx/store'; import { Observable } from 'rxjs'; import { INCREMENT, DECREMENT, RESET} from '../../store/reducer'; interface AppState { count: number; } @Component({ selector: 'app-article', templateUrl: './article.component.html', styleUrls: ['./article.component.css'] }) export class ArticleComponent { count: Observable<number>; constructor(private store: Store<AppState>) { // 注入store this.count = store.pipe(select('count')); // 从app.module.ts中获取count状态流 } increment() { this.store.dispatch({ type: INCREMENT }); } decrement() { this.store.dispatch({ type: DECREMENT }); } reset() { this.store.dispatch({ type: RESET }); } }
テンプレート ページ:
app\module\article\ Article.component.html<div class="state-count"> <button (click)="increment()">增加Increment</button> <div>Current Count: {{ count | async }}</div> <button (click)="decrement()">减少Decrement</button> <button (click)="reset()">Reset Counter</button> </div>ここではパイプ シンボル async が使用されています。これをサブモジュールで直接使用すると、エラーが報告されます。サブモジュールの場合、エラーも報告されます。具体的な理由については、コースウェアで説明されている問題を参照してください: パイプ ' async' が見つかりませんか?
次のように変更します:count: Observable<number>;
constructor(private store: Store<AppState>) { // 注入store
var stream = store.pipe(select('count'));
// 从app.module.ts中获取count状态流
stream.subscribe((res)=>{
this.count = res;
})
}
5アクションを分割するにはどうすればよいですか?
新しい \app\store\actions.ts ファイルを作成しますimport { Injectable } from '@angular/core'; import { INCREMENT, DECREMENT, RESET } from './types'; @Injectable() export class CounterAction{ // Add=function(){} Add(){ return { type: INCREMENT } } } // 就只这样导出是不行的 // export function Add1(){ // return { type: INCREMENT } // }
import {CounterAction} from './store/actions'; ... providers: [CounterAction],
import {CounterAction} from '../../store/actions'; export class ArticleComponent implements OnInit { constructor( private action: CounterAction //注入CounterAction ) { } increment() { // this.store.dispatch({ type: INCREMENT }); //把 actions分离出去 this.store.dispatch(this.action.Add()); } }
以上がAngular での状態管理に ngrx/store を使用するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。