Думаю, вам не потрібно.
(Вибачте за зневажливу відповідь, але це найкраще рішення з мого досвіду.)
Store - це джерело правди для ваших даних. Це добре.
Якщо ви використовуєте React Router, нехай це буде джерелом правди для вашого стану URL.
Не обов’язково тримати все в магазині.
Наприклад, враховуючи ваш варіант використання:
Оскільки параметри url містять лише шматки лекцій та вибрані глави. У магазині я маю перелік лекцій та розділів з іменем, кулями та вибраним булевим значенням.
Проблема в тому, що ви дублюєте дані. Дані в store ( chapter.selected
) дублюються в стані React Router. Одним із варіантів буде їх синхронізація, але це швидко ускладнюється. Чому б просто не дозволити React Router стати джерелом істини для вибраних глав?
Тоді стан вашого магазину виглядатиме (спрощеним):
{
visibleChapterSlugs: ['intro', 'wow', 'ending'],
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) => {
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)