Backbone.MarionetteアプリをReactに置き換えようとしていますが、クエリパラメーターについて考えるのが困難に直面しています。質問は全くナンセンスです。どんなサポートも感謝するか、もっと具体的にグーグルで検索できる方向を示してください。
ユーザーを一覧表示する/users
ページがあり、検索バーでユーザーをフィルタリングできます。そのため、ユーザー名に「joe」を含むユーザーをフィルタリングする場合は、/users?username=joe
などのクエリパラメーターを使用してサーバーにリクエストを送信します。さらに、page
パラメーター(/users?username=joe&page=1
)を追加することでページ分割することもできます。
機能だけを考えれば、フローはおそらく
joe
を入力要素に挿入し、Searchをクリックします。Action
(Action.getUserなど)が起動します。Action
はサーバーにリクエストを行い、結果を受け取りますDispatcher
は、Store
に関心がある人(通常はAction
)に結果ペイロードを持つ関数をディスパッチします。Store
の状態は、Action
が受け取った新しい結果で変化しますComponent
)は、Store
の変更をリッスンして再レンダリングします。期待どおりに機能します。ただし、クライアントが現在のフィルター処理された結果をブックマークして、しばらくしてから同じページに戻ることができるようにしたいと思います。これは、クライアントが作成した検索用語に関する明示的な情報を保存するためにどこかが必要になることを意味します。通常、これはURLです(そうですか?)。そのため、検索用語(/users?username=joe&page=1
)を保存するには、クエリパラメーターでURLを更新する必要があります。
私が混乱しているのは、いつどこでURLを更新するのですか?私が今思いつくことができるのは、以下の2つのオプションです-そして、それらはまったくきれいではないようです。
joe
を入力要素に挿入し、Searchをクリックします。/users?username=joe&page=1
)でReactRouterの遷移が起動します。Component
)は、this.props.params
およびthis.props.query
を介して新しいパラメーターを受け取ります。Component
)は、受信するクエリパラメーターに応じてAction.getUser
のようなAction
を起動します。この場合はusername=joe&page=1
です。この後、上記と同じです
joe
を入力要素に挿入し、Searchをクリックします。Action
(Action.getUserなど)が起動します。Action
はサーバーにリクエストを行い、結果を受け取りますDispatcher
は、Store
に関心がある人(通常はAction
)に結果ペイロードを持つ関数をディスパッチします。Store
の状態は、Action
が受け取った新しい結果で変化しますComponent
)は、Store
の変更をリッスンして再レンダリングします。 そして、どういうわけか(まだわかりません)props
(this.props.searchusername
やthis.props.searchpage
など)に応じてURLを更新しますクエリパラメータの処理のベストプラクティスは何ですか? (または、これはクエリパラメータに固有ではない場合があります)デザインパターンまたはアーキテクチャを完全に誤解していますか?あらゆるサポートに感謝します。
読んだ記事
あなたが何を意味するのか完全にはわからない
これは、情報を保存するためにURLを更新する必要があることを意味します(/ users?username = joe&page = 1)。
おそらくこれと同様の構造になります。
TopContainer.jsx-Users.jsx-User.jsxのリスト
通常、TopContainerはすべてのストアを監視し、何か変更があった場合は、users.jsxに渡します。このようにして、Users.jsxでは、再レンダリングを心配することなく、this.props.usersを単純にレンダリングできます。
ユーザーの検索アクションは通常、TopContainerのcomponentWillMountイベントで発生し、ページはUserStoreをリッスンします。これは、クエリパラメータを投入するのに適した場所です。このような何かが動作します
componentWillUnmount() {
let searchTerm = router.getCurrentQuery().searchTerm;
UserActions.searchUsers(searchTerm)
},
このページは、URLにクエリパラメータがあるかどうかを実際に気にしません。ユーザーストアにあるものは何でもありません。
その後、検索が終了すると、Users.jsxがリロードされ、正しい結果が表示されます
ロケーションクエリ(ユーザー名)のみを設定する送信ボタンをベストプラクティスと見なします。残りは、ルータコンポーネントとして割り当てられているメインのリアクションコンポーネントによって処理される必要があります。これにより、URLを再訪したり共有したりしても、同じ結果が得られることを確認できます。これも非常に一般的です。
このようなもの:
let myQuery = this.props.location.query;
if (myQuery.username) {
let theUser = myQuery.username;
this.setState({
userName = myQuery.username
});
} else {
this.setState({
userName = false //Show All
});
}
そして、この状態「userName」を使用して、検索するサーバーに送信します。この方法により、サーバーはすでに関連データを送信しているため、ユーザーのリストを処理するコンポーネントのコードを繰り返す必要はありません。
Reactでロケーションクエリを使用した経験では、反応性サイクルとパフォーマンスに非常に満足しています。 URLに関連するすべての異なるアプリの状態を維持することを強くお勧めします。