Ich denke du musst nicht.
(Entschuldigen Sie eine abweisende Antwort, aber meiner Erfahrung nach ist dies die beste Lösung.)
Der Speicher ist die Quelle der Wahrheit für Ihre Daten. Das ist in Ordnung.
Wenn Sie React Router verwenden, lassen Sie es die Quelle der Wahrheit für Ihren URL-Status sein.
Sie müssen nicht alles im Laden behalten.
Betrachten Sie zum Beispiel Ihren Anwendungsfall:
Weil die URL-Parameter nur die Slugs der Vorlesungen und der ausgewählten Kapitel enthalten. Im Laden habe ich eine Liste von Vorlesungen und Kapiteln mit einem Namen, einer Schnecke und einem ausgewählten Booleschen Wert.
Das Problem ist, dass Sie die Daten duplizieren. Die Daten in store ( chapter.selected
) werden im React Router-Status dupliziert. Eine Lösung wäre, sie zu synchronisieren, aber dies wird schnell komplex. Warum nicht einfach React Router die Quelle der Wahrheit für ausgewählte Kapitel sein lassen?
Ihr Geschäftsstatus würde dann wie folgt aussehen (vereinfacht):
{
visibleChapterSlugs: ['intro', 'wow', 'ending'],
chaptersBySlug: {
'intro': {
slug: 'intro',
title: 'Introduction'
},
'wow': {
slug: 'wow',
title: 'All the things'
},
'ending': {
slug: 'ending',
title: 'The End!'
}
}
}
Das ist es! Nicht selected
dort aufbewahren. Lassen Sie stattdessen React Router damit umgehen. Schreiben Sie in Ihren Routen-Handler so etwas wie
function ChapterList({ chapters }) {
return (
<div>
{chapters.map(chapter => <Chapter chapter={chapter} key={chapter.slug} />)}
</div>
)
}
const mapStateToProps = (state, ownProps) => {
const selectedSlugs = ownProps.params.selectedSlugs.split(';')
const chapters = state.visibleChapterSlugs.map(slug => {
return Object.assign({
isSelected: selectedSlugs.indexOf(slug) > -1,
}, state.chaptersBySlug[slug])
})
return { chapters }
}
export default connect(mapStateToProps)(ChapterList)