Astroのウェブサイトを アイランドアーキテクチャ / パーシャルハイドレーション で構築する際に、 「コンポーネント間で状態を共有したい」 という問題に直面することがあります。
ReactやVueなどのUIフレームワークは、他のコンポーネントなどの 「コンテキスト」プロバイダー の利用を奨励する場合があります。
ただし、AstroやMarkdown内で コンポーネントを部分的にハイドレート する場合、これらのコンテキスト ラッパーを使用することはできません。
Astroは、クライアント側の共有ストレージに別のソリューション (Nano Stores) を推奨しています。
Nano Storesライブラリを使用すると、任意のコンポーネントが相互作用できるストアを作成できます。
Nano Storesを推奨する理由は次の通りです。
- 軽量です。 Nano Storesは必要最低限のJS(1KB未満)を依存関係なしで提供します。
- フレームワークに依存しません。 これにより、フレームワーク間での状態共有がシームレスになります!Astroは柔軟性を重視しているため、どのフレームワークを使用しても同様の開発者体験を提供するソリューションが好きです。
それでも、あなたが探せる選択肢はいくつもあります。
選択肢はには次のものが含まれます。
使い始めるには、Nano Storesと、お好みのUIフレームワーク用のヘルパーパッケージをインストールしてください。
ここからNano Stores使用ガイドに遷移するか、以下の例に従って進めてください!
簡単なeコマースインターフェースを構築するとしましょう。
以下の3つのインタラクティブな要素があります。
- 「カートに追加」送信フォーム
- カートに追加されたアイテムを表示するフライアウトメニュー
- カートフライアウトメニューのトグル
完成した例 をあなたのマシンやオンラインでStackBlitzを介して試してみてください。
あなたの基本的なAstroファイルは次のようになります。
CartFlyoutToggle
がクリックされたときにCartFlyout
を開くようにしましょう。
まず、新しいJSまたはTSファイルを作成して、ストアを含めます。
このために“atoms”を使用します。
次に、このストアを読み取りや書き込みが必要なファイルにインポートします。
まず、CartFlyoutToggle
を接続します。
次に、CartFlyout
コンポーネントからisCartOpen
を読み取ります。
では、カート内のアイテムを追跡してみましょう。
重複を避け、「数量」を追跡するために、アイテムのIDをキーとしてカートをオブジェクトとして保存できます。
これにmapsを使用します。
先ほどのcartStore.js
にcartItem
ストアを追加しましょう。
型を定義したい場合はTypeScriptファイルに切り替えることもできます。
次に、コンポーネントが使用できるようにaddCartItem
ヘルパーをエクスポートします。
- アイテムがカートに存在しない場合、数量1でアイテムを追加します。
- アイテムがカートに存在する場合、数量を1つ増やします。
ストアを設置すれば、フォームが送信されるたびに AddToCartForm
内でこの関数を呼び出すことができます。
また、カートのフライアウトメニューを開き、カートの全体の概要を表示できるようにします。
最後に、カートアイテムを CartFlyout
内にレンダリングします。
これで、銀河系で最小のJSバンドルを持つ完全にインタラクティブなeコマースのサンプルが完成しました 🚀
完成した例を試してみてください 自分のマシンまたはStackBlitzでオンラインで試してみましょう!
Recipes