Reduxの状態とurlハッシュタグのパラメータを同期させる方法
質問
講義と章のリストがあり、ユーザーが選択と解除ができます。この2つのリストはreduxストアに保存されています。 今、私たちは選択された講義のスラッグと章のスラッグの表現をURLのハッシュタグに保持し、URLへの変更はストアも変更する必要があります(双方向同期)したい。
を使用した最良の解決策は何でしょうか? react-router あるいは 反応ルータ-REDUX ?
リアクトルーターがURLのハッシュタグを維持するためにのみ使用され、また1つのコンポーネントのみを更新するような良い例を実際に見つけることができませんでした。
どのように解決するのですか?
必要ないのでは?
(見切り発車的な回答で申し訳ありませんが、私の経験上、これがベストな解決策です)
ストアはデータの真実の源です。これでよいのです。
React Routerを使うなら、URLの状態の真実の源はReact Routerに任せましょう。
すべてをストアに保持する必要はありません。
例えば、ユースケースを考えてみると
URLパラメータは、選択された講義と章のスラッグのみを含むためです。ストアには、名前、スラッグ、および選択されたブール値を持つ講義と章のリストがあります。
問題は、データを重複させていることです。ストアのデータ (
chapter.selected
) のデータは、React Router のステートで重複しています。解決策の1つは、それらを同期することですが、これはすぐに複雑になってしまいます。React Routerを選択されたチャプターの真実のソースとするのはどうでしょうか?
あなたのストアの状態は、(単純化すると)次のようになります。
{
// Might be paginated, kept inside a "book", etc:
visibleChapterSlugs: ['intro', 'wow', 'ending'],
// A simple ID dictionary:
chaptersBySlug: {
'intro': {
slug: 'intro',
title: 'Introduction'
},
'wow': {
slug: 'wow',
title: 'All the things'
},
'ending': {
slug: 'ending',
title: 'The End!'
}
}
}
以上です。保存しないでください
selected
を保存しないでください。代わりにReact Routerに処理を任せます。ルートハンドラでは、次のように記述します。
function ChapterList({ chapters }) {
return (
<div>
{chapters.map(chapter => <Chapter chapter={chapter} key={chapter.slug} />)}
</div>
)
}
const mapStateToProps = (state, ownProps) => {
// Use props injected by React Router:
const selectedSlugs = ownProps.params.selectedSlugs.split(';')
// Use both state and this information to generate final props:
const chapters = state.visibleChapterSlugs.map(slug => {
return Object.assign({
isSelected: selectedSlugs.indexOf(slug) > -1,
}, state.chaptersBySlug[slug])
})
return { chapters }
}
export default connect(mapStateToProps)(ChapterList)
関連
-
[解決済み] ページを再読み込みせずにURLを変更するにはどうすればよいですか?
-
[解決済み] URLを新しいタブで開く(新しいウィンドウではない)
-
[解決済み] Reduxのアクションをタイムアウトでディスパッチする方法とは?
-
[解決済み] JavaScriptでURLの#hashを確認する方法は?
-
[解決済み] Reactのstateとpropsの違いとは?
-
[解決済み] Reduxストアの状態をリセットする方法とは?
-
[解決済み] JavaScriptで、ある文字列が別の文字列の中に出現するすべてのインデックスを見つけるにはどうすればよいですか?
-
[解決済み] CORS OriginヘッダーとCSRFトークンによるCSRF保護
-
[解決済み] $.ajax実行中にローディングイメージを表示する
-
[解決済み] Prototypeを使ってtextareaを自動サイズ調整するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] Node.jsでbase64エンコードされた画像をAmazon S3へアップロードする
-
[解決済み] React js 親コンポーネントから子コンポーネントの状態を変更する
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] JavaScriptでの大文字小文字を区別しない正規表現
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] JavaScriptのArray.sort()メソッドでシャッフルするのは正しいのか?
-
[解決済み] これは純関数ですか?