Pinia/Vuex および Redux は、「信頼できる唯一の情報源」となるように設計されており、どこからでも取得できるアプリケーション データを保持するストアを 1 つ以上持つことができます。
ピニアの店舗はこんな感じです:
リーリーは次のように使用できます:
リーリー複数のストアを作成できます:
リーリーストアは相互に参照できます:
リーリー最後に、Pinia/Vuex は、状態に保存されたデータを取得および操作する機能を提供するツールです。
しかし、もう 1 つの成熟したアプローチがあります。それは、マネージャー/サービス クラスです。
前の例は次のように書き換えることができます:
リーリー これらはすべて、追加のラッパー (ref()
など) を必要とせずに、TypeScript で簡単に入力できます。
さらに、依存関係の注入は提供されません。構成内のストアを初期化して、あるストアを別のストアに正確に注入することはできません。
useProductsStore() などを渡す必要があります。
継承やその他の OOP も不可能です。
Pinia は循環依存関係さえも促進し、その結果、保守性の低いスパゲッティ コードが生成されます。
それでは、結局のところ、なぜマネージャー クラスを使用した実証済みのクリーンな OOP アプローチよりも Pinia/Vuex を好む必要があるのでしょうか?私は、「次に推奨される Vue の状態管理」として Pinia を使用して、自分で発明したチュートリアル プロジェクトを書くのに何十時間も費やしてきました。しかし、今では、Pinia が不格好でリッチだと思うので、すべてをマネージャー クラスに書き直したいという誘惑に駆られています。数年前、Vue2 を使用して別のテスト プロジェクトを作成していたことを思い出しました。そのときはマネージャー クラスを使用し、すべてがスムーズに進みました。何かを見落としていましたか?ピニアをやめたら何か問題はありますか?
クラスは Vue の反応性においては二級市民であり、落とし穴がいくつかあります。これらは コンストラクター内で
クラスには、Vue 開発ツールやプラグイン システムなどの広範なサポートなど、ストアが備えている機能がありません。this
にバインドできません。その結果、非リアクティブ クラス インスタンスのリアクティブ プロキシが使用されます。これらの参照は 文書化されていますが、通常とは異なる方法で記述されているため、彼らは 参照を効果的に使用できません 。 get/set アクセサーを使用して参照を計算することはできません。これらの問題を解決するには、Vue リアクティブ API を明示的に使用して、奇妙な方法でクラスを作成するか、reactive(new MyClass)が正しく動作するのを妨げないように制限された方法でクラスを設計する必要があります。
リーリー
多くの場合、インスタンスを保存するよりもコンポーザブルを保存する Pinia を処理する方が適切です。これにより、コンポーザブルが時期尚早に呼び出された場合に問題となる循環依存関係が解決されます。同じ問題がクラスでも発生する可能性があり、クラス インスタンスを直接使用する代わりに DI コンテナを使用する必要があります。