DeRxJSViewModel 모드: 상태 관리의 E=mc^2 [제2부분]
20009 단어 rxjsreactjavascriptangular
이 문서에서는 상태 관리 코드를 설명하고 React, Angular, Vanilla JS 등 3개의 프런트엔드 '프레임워크'에서 사용하는 방법을 보여 드리겠습니다.
리액션
DeRxJS의 목표 중 하나는 우리의 코드 라이브러리에서 실제 RxJS 코드를 삭제하는 것이다.이전 예에서 우리는 @derxjs/reducer 어떻게 우리가 상태 관리를 작성하고 RxJS를 이용하는 데 도움을 줄 수 있는지 토론했지만 실제로는 어떤 RxJS 코드도 직접 작성할 필요가 없었다.
본고에서, 나는 매우 흥분해서 소개했다. @derxjs/react. 이것은 우리가react 프레젠테이션 코드에서 같은 방법을 이용할 수 있게 할 것이다.
솔직히 말하면, 나는 React를derxjs의 첫 번째 프레젠테이션 원고를 기반으로 하는 소프트웨어 패키지로 열거했는데, 이것은 어느 정도에 React가 인기가 있기 때문이다.그러나 그 외에 내가 먼저 겨냥한 두 가지 큰 이유가 있다.
다음은 @derxjs/react 코드의 일반api입니다.
export const TicTacToe = () => {
return DeRxJSComponent<
TicTacToeViewModelInputs,
TicTacToeViewModel,
TicTacToeProps
>({
viewModel$: ticTacToeViewModel$,
component: TicTacToeView as any,
initialValue: createInitialViewModel(),
triggerMap: {
spaceClick: 'userSpaceClickEvents$',
resetClick: 'userResetClickEvents$',
},
inputs: {
ai: randomAi,
},
});
};
viewModel$
는 이전 문장component
는 표현 성분이다(우리는 아래에서 볼 것이다!)initialValue
우리 상태의 시작값createInitialViewModel()
함수도 이전 글에서 왔다)triggerMap
는 [유형 안전!]대상, 이 대상은 구성 요소의 '트리거' 함수의 이름을 viewModel$
관찰할 수 있는 입력에 비추는 것입니다.트리거 함수는 프레젠테이션 구성 요소를 전달하는 데 필요한 정보를 @derxjs/react 패키지에 전달하여 관찰할 수 있도록 하는 방법입니다. (따라서 RxJS 코드를 직접 작성할 필요가 없습니다.)inputs
는 우리가 viewModel$
기능에 어떠한 비반응(또는 관찰할 수 없는) 입력을 제공하는 방식이다.주의, 우리는 여기서 randomAi
함수를 전달한다. 기본적으로 이런 방식으로 매개 변수화viewModel$
의 기능을 한다.(미래의 업무에서'비길 데 없는'인공지능을 창조하는 것도 재미있을 것이다!)다음은 코드의 최종 모양입니다.
interface TicTacToeProps {
spaceClick: (spaceCoordinates: SpaceCoordinates) => void;
resetClick: () => void;
}
interface SpaceProps {
contents: SpaceContent;
spaceCoordinates: SpaceCoordinates;
clickHandler: (spaceCoordinates: SpaceCoordinates) => void;
}
const Space = ({ contents, clickHandler, spaceCoordinates }: SpaceProps) => (
<div>
<button onClick={() => clickHandler(spaceCoordinates)}>
{contents.toUpperCase()}
</button>
</div>
);
function TicTacToeView({
state,
triggers,
}: {
state: TicTacToeViewModel;
triggers: TicTacToeProps;
}) {
return (
<>
<h2>{state.turn}</h2>
<div className={'border'}>
<div className={'board'}>
{([0, 1, 2] as const)
.map((row) => ([0, 1, 2] as const).map((column) => [row, column]))
.flat()
.map(([row, column]) => (
<Space
contents={state.board[row][column]}
spaceCoordinates={{ row, column }}
clickHandler={triggers.spaceClick}
key={`${row}:${column}`}
/>
))}
</div>
</div>
<button className="reset" onClick={triggers.resetClick}>
Reset
</button>
</>
);
}
onClick
가 우리가 정의한'촉발 함수'로 어떻게 설정되었는지 주의하십시오.다음은 실행 중인 코드입니다.
모서리의
다음: 각도!앞에서 말한 바와 같이, 나는 Angular가 국가 관리 방면에서 통상적으로 매우 영역에서 알 수 없다고 생각한다.특히 RxJS에는 매우 우호적이다.
그래서 @derxjs/angular 패키지가 정말 필요한지 모르겠습니다.최종적으로, 우리는 우리가 작성할 더 많은 RxJS 코드를 숨길 수 있는 유틸리티 패키지를 만들 수 있지만, 나는 아직 이 방면의 계획이 없다.
다음은 우리가 작성할 Typescript 구성 요소 코드입니다.
export class AppComponent {
userResetClickObserver!: Observer<void>;
userResetClickEvents$ = new Observable<void>(
(observer) => (this.userResetClickObserver = observer)
);
userSpaceClickObserver!: Observer<SpaceCoordinates>;
userSpaceClickEvents$ = new Observable<SpaceCoordinates>(
(observer) => (this.userSpaceClickObserver = observer)
);
vm$ = ticTacToeViewModel$({
ai: randomAi,
userSpaceClickEvents$: this.userSpaceClickEvents$,
userResetClickEvents$: this.userResetClickEvents$,
});
rows: BoardIndex[] = [0, 1, 2];
handleSpaceClick(coordinates: SpaceCoordinates) {
this.userSpaceClickObserver.next(coordinates);
}
handleResetClick() {
this.userResetClickObserver.next();
}
}
'구성시' 클래스에'observer '속성을 만들어서 관찰 대상을 만드는 방법을 주의하십시오. 그리고 클릭 핸들러 방법에서 이 관찰 대상을 호출합니다. next()
(이것은 우리의 React 코드와 본질적으로 같은'메시지 전달'이지만 @derxjs/React 패키지는 대부분의 실제 코드를 숨깁니다)"React 예시와 유사하게 템플릿에서""구현""구성 요소를 볼 수 있습니다. 유일한 예외는 우리
viewModel$
를 템플릿 맨 위에 전달하는 각도의 비동기 파이프라인입니다.<h1>Tic Tac Toe</h1>
<ng-container *ngIf="vm$ | async as vm">
<h2>{{ vm.turn }}</h2>
<div class="border">
<div class="board">
<ng-container *ngFor="let row of rows">
<div *ngFor="let column of rows">
<button (click)="handleSpaceClick({ row, column })">
{{ vm.board[row][column] | uppercase }}
</button>
</div>
</ng-container>
</div>
</div>
<button class="reset" (click)="handleResetClick()">Reset</button>
</ng-container>
좋기도 하고 간단하기도 하다.다음은 각도 코드의 Stackblitz입니다.바닐라 JS
이 예에서 우리는 dom-manipulation API를 사용하여 예시의 반작용력과 각도 향상을 집행할 것이다.다음은 우리가 작업한 간소화 버전이다.
Element
대상을 변하지 않고 텍스트 내용을 변경할 수 있다.만약 그렇지 않다면 이것은 매우 어려울 것이다.fromEvent
를 사용하여 단추의'클릭'이벤트의 관찰성을 얻습니다.viewModel$
에 전달하여 관찰할 수 있는 보기 모델을 만든다.board
속성과 일치하도록 합니다.결론
이것은 총결산이다!!이 글이 멋진 생각을 불러일으키길 바란다.만약 상태 관리나 양호한 코드 체계 구조를 알고 싶다면 반드시 연락하거나 보십시오the DeRxJS repo!
작성자 정보
Zack DeRose[또는DeRxJS, 당신이 좋아한다면]:
Reference
이 문제에 관하여(DeRxJSViewModel 모드: 상태 관리의 E=mc^2 [제2부분]), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/zackderose/the-derxjsviewmodel-pattern-the-emc2-of-state-management-part-2-2i73텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)