ユーザインタフェースコンポーネントの状態駆動開発


私はよく、簡単にする必要があるユーザインタフェースの状態を記述するコードを見ます.
ユーザーのリストを出力するコードを見ましょう.
  <ng-container *ngIf="isLoading && !error">Loading...</ng-container>
  <ul *ngIf="users && users.length && !error">
    <li *ngFor="let user of users">{{user.name}}</li>
  </ul>
  <ng-container *ngIf="!error && !loading && users && !users.length">Nothing found</ng-container>
  <ng-container *ngIf="!isLoading && error">{{error.message}}</ng-container>
このコードはひどい.読み書きが難しい.
私は別の方法を好む.私は有限状態機械の理論について読みました.状態機械は有限状態の状態を持ち、各瞬間にこれらの状態のうちの1つにある.
ユーザのリストの4つの状態があります.
を積んでいる
  • ユーザーは、
  • を載せました
    ユーザーはエラーでロードされました
  • ユーザは、
  • を設立しませんでした
    差別された組合で状態を述べましょう.
    type State =
      | { status: 'loading' }
      | { status: 'success', data: IUser[] }
      | { status: 'failed', error: Error }
      | { status: 'not-founded' }
    
    ビューロジックを書き直しましょう.
      <ng-container *ngIf="state.status === 'loading'">Loading...</ng-container>
      <ul *ngIf="state.status === 'success'">
        <li *ngFor="let user of state.data">{{user.name}}</li>
      </ul>
      <ng-container *ngIf="state.status === 'not-found'">Nothing found</ng-container>
      <ng-container *ngIf="state.status === 'failed'">{{state.error.message}}</ng-container>
    
    ジェネリックを使用して状態型を普遍的にすることができます.
    type State<TSuccessData> =
      | { status: 'loading' }
      | { status: 'success', data: TSuccessData }
      | { status: 'failed', error: Error }
      | { status: 'not-founded' }
    type UsersListState = State<IUser[]>;
    
    このコードは、より多くの読書と自己ドキュメントです.現在、あなたのIDEはあなたのためにより良いヒントを与えます.


    あなたのチームはあなたに感謝します.
    P . S .私の英語でごめんなさい.英語で私の最初の記事です.