Tôi nghĩ bạn không cần phải làm vậy.
(Xin lỗi vì một câu trả lời phiến diện nhưng đó là giải pháp tốt nhất theo kinh nghiệm của tôi.)
Lưu trữ là nguồn trung thực cho dữ liệu của bạn. Điều này là tốt.
Nếu bạn sử dụng React Router, hãy để nó là nguồn trung thực cho trạng thái URL của bạn.
Bạn không cần phải giữ mọi thứ trong cửa hàng.
Ví dụ: xem xét trường hợp sử dụng của bạn:
Bởi vì các tham số url chỉ chứa các slugs của bài giảng và các chương được chọn. Trong cửa hàng, tôi có một danh sách các bài giảng và chương với tên, slug và giá trị Boolean đã chọn.
Vấn đề là bạn đang sao chép dữ liệu. Dữ liệu trong store ( chapter.selected
) được sao chép ở trạng thái React Router. Một giải pháp sẽ là đồng bộ hóa chúng, nhưng điều này nhanh chóng trở nên phức tạp. Tại sao không để React Router là nguồn chân lý cho các chương đã chọn?
Trạng thái cửa hàng của bạn sau đó sẽ trông giống như (đơn giản hóa):
{
visibleChapterSlugs: ['intro', 'wow', 'ending'],
chaptersBySlug: {
'intro': {
slug: 'intro',
title: 'Introduction'
},
'wow': {
slug: 'wow',
title: 'All the things'
},
'ending': {
slug: 'ending',
title: 'The End!'
}
}
}
Đó là nó! Đừng lưu trữ selected
ở đó. Thay vào đó, hãy để React Router xử lý nó. Trong trình xử lý tuyến đường của bạn, hãy viết một cái gì đó như
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)