Không có cách nào để đăng ký một phần của cửa hàng khi sử dụng trực tiếp subscribe
, nhưng với tư cách là người tạo Redux tự nói - don't use subscribe
directly! Để dòng dữ liệu của ứng dụng Redux thực sự hoạt động, bạn sẽ muốn một thành phần kết thúc tốt đẹp toàn bộ ứng dụng. Thành phần này sẽ đăng ký với cửa hàng của bạn. Phần còn lại của các thành phần của bạn sẽ được trẻ em để thành phần này wrapper và sẽ chỉ nhận được các phần của nhà nước mà họ cần.
Nếu bạn đang sử dụng Redux với React thì có tin tốt - gói chính thức react-redux sẽ giải quyết vấn đề này cho bạn! Nó cung cấp thành phần bao bọc đó, được gọi là <Provider />
. Sau đó, bạn sẽ có ít nhất một "thành phần thông minh" lắng nghe những thay đổi trạng thái được chuyển xuống bởi Provider
từ cửa hàng. Bạn có thể chỉ định phần nào của trạng thái cần nghe và các phần của trạng thái sẽ được chuyển xuống dưới dạng đạo cụ cho thành phần đó (và sau đó tất nhiên, nó có thể chuyển những phần đó xuống cho con riêng của nó). Bạn có thể chỉ định điều đó bằng cách sử dụng chức năng connect() trên thành phần "thông minh" của mình và sử dụng chức năng mapStateToProps
làm thông số đầu tiên. Để tóm tắt lại: phần gốc
Quấn với Provider
thành phần đặt mua để lưu trữ thay đổi
ReactDOM.render(
<Provider store={store}>
<App />
</Provider>,
document.getElementById('root')
)
Bây giờ bất kỳ con của <App />
được bao bọc bởi connect()
sẽ là một "thông minh" thành phần. Bạn có thể vượt qua trong mapStateToProps
để chọn một số phần nhất định của tiểu bang và cung cấp những phần đó làm đạo cụ.
const mapStateToProps = (state) => {
return {
somethingFromStore: state.somethingFromStore
}
}
class ChildOfApp extends Component {
render() {
return <div>{this.props.somethingFromStore}</div>
}
}
//wrap App in connect and pass in mapStateToProps
export default connect(mapStateToProps)(ChildOfApp)
Rõ ràng <App />
có thể có nhiều trẻ em và bạn có thể chọn và chọn phần nào của nhà nước các mapStateToProps
nên lắng nghe cho mỗi con của nó. Tôi khuyên bạn nên đọc tài liệu theo số usage with React để hiểu rõ hơn về luồng này.
Nguồn
2016-03-25 04:32:42
Cảm ơn bạn đã trả lời chi tiết như vậy –
Thật tuyệt vời. Tôi muốn có một thành phần để phản ứng với một hành động. Giả sử có một thành phần 'NavBar' gửi một hành động' toggleDrawer'. Hành động này lưu trữ một giá trị trong kho đại diện cho trạng thái của ngăn kéo 'isDrawerOpen'. Sau đó, làm thế nào tôi làm cho ngăn kéo được mở ra khi hành động được gửi đi? Ngoài ra ở đây có một xung đột tiềm năng: bản thân ngăn kéo có thể được mở và nó điều khiển thuộc tính 'mở' của nó, vì vậy việc thay đổi' isDrawerOpen' khỏi ngăn kéo sẽ gây ra một vòng lặp vô hạn ... – Miquel
vẫn còn có mã trong 'connect' để trả lời tất cả các thay đổi và thực hiện ít nhất một số mã trước khi so sánh sự trở lại trước đó và tiếp theo của 'mapStateToProps', do đó ảnh hưởng đến hiệu suất không cần thiết. Tôi chỉ tự hỏi nếu chúng ta có thể phát hiện tên của các phím mong muốn, ví dụ: 'function mapStateToProps (({someKey, anotherReducerKey}) => ...' và chỉ đăng ký với những cái đó. Trong javascript bạn có thể lấy tên của các đối số - Câu hỏi đặt ra là bạn có thể lấy tên của các khóa bị phá hủy của các đối số này –