WebコンポーネントのReduxコントローラを書きましょう


エリオットMarquezは、私にLit & Friends slackの上でReduxコントローラを書くよう訴えました.
-アクションボタン
背景色:うんちD 7 Die 2!重要
カラー:竜華ffffff!重要
ボーダーカラー:5 .重要


Elliottに続く
I work on Developer experiences at Chrome and closely with the web platform
それで、クラックをしましょう!

ステップ0 :セットアップ
最初のステップは、新しいプロジェクトを作成し、いくつかの依存関係をインポートを開発しましょう.
mkdir controllers
cd controllers
git init
npm init --yes
npm i -D typescript lit
touch reducer.ts
次に、コントローラのクラスを設定します.TS
import type { ReactiveController, ReactiveControllerHost } from 'lit';

export class ReducerController implements ReactiveController {
  constructor(
    public host: ReactiveControllerHost,
  ) {
    host.addController(this);
  }

  hostUpdate()?: void;
}
そのhostUpdateシグネチャは、タイプスクリプトが文句を言わないようにするだけです.🤷.

ステップ1:減速機
我々のコントローラは、若干の状態Tと若干のアクションAを取って、若干の他の、または、同じ状態Tを返す機能の上で、基本的にいくつかの状態性を結びつけます.そのためには、
type Reducer<T, A> = (state: T, action: A) => T;
コントローラはいくつかの初期状態と共にその還元器を取り、クラスインスタンスにそれらをピンでとめなければなりません.
export class ReducerController<T = unknown, A = unknown> implements ReactiveController {
  public state: T;

  constructor(
    private host: ReactiveControllerHost,
    public reducer: Reducer<T, A>,
    public initialState: T,
  ) {
    this.host.addController(this);
    this.state = initialState;
  }

  hostUpdate?():void
}

ステップ2:アクション
信じられるかどうかは、我々はかなり行われている.我々が必要とする最後の部分は242479142のアクションを実行し、ホストを更新するdispatchメソッドを実装することです.
dispatch(action: A): void {
  this.state = this.reducer(this.state, action);
  this.host.requestUpdate();
}
そして、シェフジョンが言うように、それはそれです!
コントローラを使いたいなら、互換性のあるホスト(litterのような)で作成してください.
Live Demo