コード例
ここではApple Storeを模写しながら、Turbo, Stimulusのステートの使い方を考えてみます。Apple Storeの場合は以下のようになっています
また、オプション選択をしてもネットワーク通信は発生しません。価格更新を含めてすべてブラウザだけでやっています。
このページの複雑さの要因は下記のものと言えます。コードをちゃんと整理しないとスペゲッティーになる程度には複雑です。
比較的ステート管理が複雑な例ではないかと思いますので、これを使ってHotwireによるステート管理を議論したいと思います。以下の方法を検討します。
実装した結果の詳細は関連ページでご確認いただけます。ここでは全体を通した印象をお伝えします。
target
を繋げて更新する場合は、ファイルを行き来しなければならないので多少書きにくくなります。ステートをすべてStimulusに持たせた場合がこのケースですIPhone.js
やIphone.rb
などのview modelに持たせることが効果的です。View Modelにしっかりロジックを収められれば、上記の3手法の違いは些細に感じられました上記のことから、Stimulusでもある程度複雑なブラウザステートが管理できることがわかりました。そもそもステート管理はviewがやることではなく、modelなどで行うものですので、StimulusとReactで同様に管理できることは当然と言えば当然です。
StimulusとReactのコードの主な違いは、modelのデータをviewに反映させるところです。ReactはJSXテンプレートをすべて再レンダリングしますので、データをviewに反映させる処理がわかりやすくなっています。さらにこれを自動的にやってくれます。Stimulusの場合はここが多少煩雑になります。
一方で、ステートをサーバ側で管理する場合が一番簡単です。ブラウザでステートを管理する場合はCatalog
クラス(app/models/catalog.rb
)で製品情報を一旦すべて集約して、これを一気にブラウザに送る必要があります。それに対してサーバ側で管理する場合はIphone
クラス(app/models/iphone.rb
)でその都度計算するだけです。
上述のようにそもそも複雑なステートはmodelの問題です。StimulusやReactのようなview/controllerライブラリの問題ではありません。
一番の教訓はmodelの中でしっかり複雑さを管理することでしょう。