Ngrx 효과 - 격리각도 응용에서의 부작용
6231 단어 alltypescriptjavascriptangular
부작용은 무엇입니까?
side effect은 다음과 같은 상태 수정을 의미합니다.
카탈로그
왜 NgRx 효과입니까?
NgRx 효과
왜 NgRx 효과입니까?
순수 어셈블리에는 변수가 없으며 이벤트는 출력으로 생성됩니다.이 구성 요소들은 본질적으로 벙어리여서, 대부분의 계산은 그 밖에서 이루어진다.순수 구성 요소는 순수 기능과 유사한 단일 직책을 가지고 있다.
현재 구성 요소가 아무런 계산을 하지 않으면 대부분의 계산과 부작용이 서비스로 옮겨집니다.이것은 각도 서비스의 첫 번째 사용이다.그것들을 구성 요소에 주입하고 각종 계산을 실행하는 것은 매우 쉽다.
다음은 네가 고려해야 할 것들-
click
에서 서비스를 호출하는 방법입니다.이런 모델의 첫 번째 단점은 구성 요소가 많은 서비스에 의존하기 때문에 테스트하기 어렵다는 것이다.구성 요소를 다시 사용하는 것은 거의 불가능하다는 것을 알 수 있을 것입니다.
그럼 다른 방법은 뭐야..
또 다른 방법은 구성 요소를 순수하게 유지하고 관리 상태를 책임지지 않도록 하는 것이다.대신 데이터를 입력할 때 UI에 표시되고 UI 상호 작용이 있을 때 관련 이벤트가 생성되도록 수동적으로 설정합니다.
그냥 이렇게...
구성 요소는 입력 데이터를 어떻게 사용할 수 있는지 알 필요도, 이벤트를 어떻게 처리하는지 알 필요도 없다.
그러나 이러한 서비스는 응용 프로그램의 중요한 구성 부분이다.여기에는 여전히 다양한 계산을 수행하거나 API를 통해 통신하는 모든 방법이 포함되어 있습니다.하지만 이제 구성 요소 내부에 주입되지 않습니다.
NgRx 상태 관리에 대한 게시물을 썼습니다. 이를 통해 NgRx 상태 관리를 알 수 있습니다.
서비스 기반 설계와 NgRx 효과 간의 비교를 살펴보겠습니다.
서비스 기반의 디자인 과정에서, 당신은 비교적 적은 요소가 작용하는 것을 알아차릴 수 있지만, 그것이 당신을 속이지 않도록 해야 합니다.프로그램에 나쁜 프로그램보다 더 많은 요소가 있습니다.
서비스 기반 설계
AppComponent
에 사용자 목록이 필요하다고 가정하십시오.AppRemoteService
의 서비스를 가지고 있습니다. 이 서비스는 users$ observable
을 포함하고 사용자 목록을 구독할 수 있습니다.users$ = this.httpClient.get<User[]>(URL).pipe(take(1));
AppRemoteService
을 AppComponent
에 주입했습니다. AppRemoteService.users$
observable를 구독하겠습니다.@Component({
template: `
<div class="user-container"
*ngIf="localUsers">
<app-user *ngfor="let user of localUsers"
[inputUser]="user">
</div>
`
})
export class AppComponent{
//state inside component
localUsers: User[];
constructor(private remoteService: RemoteService){}
ngOnInit(){
//handle the subscription here
this.remoteService.users$.subscrible(
users => this.localUsers = users;
);
}
}
NgRx 효과에 기반한 설계
다음은 NgRx 효과가 어떻게 바뀔지 -
NgRx Store
을 선택하거나 state
을 보내면 됩니다.export class AppComponent implements OnInit {
constructor(private store: Store<fromApp.AppState>) { }
}
actions
을 보냅니다.export class AppComponent implements OnInit {
constructor(private store: Store<fromApp.AppState>) { }
ngOnInit(): void {
//action dispatched
this.store.dispatch(fromActions.loadUsers());
}
}
loadUsers
을 사용하여 관측 가능한 데이터에 가입합니다.
@Component({
template: `
<div class="user-container"
*ngIf="localUsers$ | async as users">
<app-user *ngfor="let user of users"
[inputUser]="user">
</div>
`
})
export class AppComponent implements OnInit {
localusers$ = this.store.select(fromSelectors.selectUsers);
constructor(private store: Store<fromApp.AppState>) { }
ngOnInit(): void {
this.store.dispatch(fromActions.loadUsers());
}
}
selectUsers
effect는 loadUsers$
에서 보낸 loadUsers
작업에 관심이 있습니다.따라서 구성 요소가 초기화될 때 AppComponent
조작을 조정합니다.효과가 반응하여 loadUsers
을 구독합니다.remoteservice.users$
효과는 loadUsers$
조작과 관련된 메타데이터 - 사용자를 발송합니다.상응하는 감속기 기능은 상태를 전환할 것이다.최신 상태는 최근feteched 사용자를 포함합니다.//app.effects.ts
loadUsers$ = createEffect(
() => this.action$.pipe(
ofType(AppActions.loadUsers),
mergeMap(() => this.remoteService.users$
.pipe(
map(users => AppActions.addUsers({ users })),
catchError(error => {
return of(error);
})
)),
));
//app.reducer.ts
//addUsers action mapping
const theReducer = createReducer(
initialState,
on(AppActions.addUsers, (state, { users }) => ({
...state,
users: [...users]
}))
);
addUsers
observable 구독은 구성 요소가 나타날 수 있도록 사용자 목록을 제공합니다.이 점을 알고 있다면, angular 프로그램에서 NgRx 효과를 설치하고 실현하는 방법을 알고 싶을 수도 있습니다.나는 상세한 댓글을 한 편 썼다.Click here 보기.
Reference
이 문제에 관하여(Ngrx 효과 - 격리각도 응용에서의 부작용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/irshsheik/ngrx-effects-isolate-side-effects-in-angular-applications-24ej텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)