Tôi có bộ định tuyến đơn giản (bắt đầu bằng redux-router
và chuyển sang react-router
để loại bỏ biến).MapStateToProps của React-redux connect() được gọi nhiều lần trên điều hướng bộ định tuyến phản ứng
<Router history={history}>
<Route component={Admin} path='/admin'>
<Route component={Pages} path='pages'/>
<Route component={Posts} path='posts'/>
</Route>
</Router>
Thành phần quản trị về cơ bản chỉ là {this.props.children}
với một số điều hướng; nó không phải là thành phần ed connect
.
Trang thành phần là một thành phần connect
ed với mapStateToProps()
như vậy:
function mapStateToProps (state) {
return {
pages: state.entities.pages
};
}
bài viết thậm chí còn thú vị hơn:
function mapStateToProps (state) {
let posts = map(state.entities.posts, post => {
return {
...post,
author: findWhere(state.entities.users, {_id: post.author})
};
}
return {
posts
};
}
Và sau đó khi tôi tải trang hoặc chuyển qua lại giữa bài/trang các tuyến đường Tôi nhận được sau đây trong console.log của tôi().
// react-router navigate to /posts
Admin render()
posts: map state to props
Posts render()
posts: map state to props
Posts render()
posts: map state to props
// react-router navigate to /pages
Admin render()
pages: map state to props
Pages render()
pages: map state to props
Vì vậy, câu hỏi của tôi là: tại sao mapStateToProps
được gọi nhiều lần vào những thay đổi tuyến đường?
Ngoài ra, tại sao hàm map
đơn giản trong mapStateToProps
làm cho nó được gọi là lần thứ ba trong vùng chứa Bài đăng?
Tôi đang sử dụng các phần tử cơ bản logger
và crashReporter
từ các tài liệu Redux và nó không báo cáo bất kỳ thay đổi trạng thái hoặc sự cố nào. Nếu trạng thái không thay đổi tại sao các thành phần lại hiển thị nhiều lần?
Mọi thông tin cập nhật về điều này, có khả năng không? –
Thành thật mà nói, không. Tôi bắt đầu xóa những thứ khác nhau để xem điều gì có thể kích hoạt nó. Tôi chỉ nhìn vào nó một lần nữa và có vẻ như hành động '@@ INIT' của Redux kích hoạt nó thêm một lần nữa, nhưng rất khó để ghi lại hành động đó. Khi kết xuất trên máy chủ, nó chỉ ghi một 'mapStateToProps' duy nhất cho mỗi vùng chứa.Đã hy vọng cho một câu trả lời từ @DanAbramov – Mike
Tôi cũng đã xem xét ví dụ thế giới thực của Redux để xem bao nhiêu lần mapStateToProps đang được gọi ở đó và nó chứa rất nhiều cuộc gọi. Tôi nghĩ rằng nó không phải là khá quan trọng miễn là bạn sử dụng một công cụ như [Chọn lại] (https://github.com/rackt/reselect) để ghi nhớ bộ chọn của bạn. – Mike