Cách lắng nghe các thay đổi thuộc tính cụ thể trong cửa hàng Redux sau khi thực hiện một hành động


76

Tôi hiện đang cố gắng khái niệm hóa cách xử lý việc gửi một hành động trong một thành phần dựa trên sự thay đổi dữ liệu sau một lần gửi trong một thành phần khác.

Hãy xem trường hợp này:

dispatch(someAjax) -> tài sản ở trạng thái cập nhật.

Sau đó, tôi cần một thành phần khác phụ thuộc vào cùng thuộc tính này để biết rằng nó đã được cập nhật và gửi một hành động dựa trên giá trị mới.

Thay vì sử dụng một số loại value.on(change...giải pháp, cách ưu tiên để xử lý loại hành động 'xếp tầng' này là gì?

Câu trả lời:


62

Có hai cách tiếp cận cơ bản: một phần mềm trung gian thay đổi trạng thái sau khi một hành động được thực hiện hoặc sử dụng store.subscribeAPI cấp thấp của Redux .

Câu hỏi thường gặp về Redux có một câu trả lời bao gồm điều này . Ngoài ra, tôi giữ một danh sách được phân loại gồm các tiện ích và bổ trợ liên quan đến Redux, và bao gồm một nhóm các thư viện đăng ký thay đổi cửa hàng hiện có triển khai các phương pháp khác nhau để lắng nghe các thay đổi dữ liệu.


1
Cảm ơn vì danh sách đó, nó thực sự hữu ích. Những gì tôi thực sự đang cố gắng tìm ra là cách tốt nhất để thông báo cho một số thành phần rằng một số dữ liệu đã quay trở lại từ lệnh gọi AJAX và phím X đã thay đổi. Mỗi thành phần này sau đó có thể kích hoạt các hành động của riêng chúng. Tôi có thể hiểu được những thay đổi trong phần mềm trung gian, nhưng phần tôi đang cố gắng tìm hiểu là phải làm gì khi phát hiện ra thay đổi. Tôi cảm thấy như một số loại bus sự kiện là cần thiết, nhưng điều đó không phù hợp với Redux. Có lời khuyên nào không?
Jazzy

1
Cách tiếp cận chính được đề xuất để giao tiếp trong React và Redux là cha mẹ chuyển đạo cụ cho trẻ và trẻ chạy lệnh gọi lại để thông báo cho cha mẹ. Tuy nhiên, các phương pháp tiếp cận khác như xe buýt sự kiện chắc chắn có công dụng của chúng và nếu xe buýt sự kiện phù hợp với trường hợp sử dụng của bạn, hãy sử dụng nó. Bạn có thể muốn xem ctheu.com/2015/02/12/…andrewhfarmer.com/component-communication để biết các ví dụ.
markerikson

4
Mặc dù bạn không trả lời cụ thể câu hỏi, mục đầu tiên trong danh sách của bạn đã hoạt động cho trường hợp của tôi. redux-watch là một cách đơn giản và sáng tạo để có được chức năng này. Cảm ơn một lần nữa vì danh sách, nó rất hữu ích.
Jazzy

Vâng, gần đây tôi đã chia trang Câu hỏi thường gặp thành các trang riêng biệt cho mỗi danh mục. Chỉ cần cập nhật liên kết trong câu trả lời của tôi để phù hợp. Cảm ơn!
markerikson

99

Bạn có thể sử dụng Redux's mapStateToPropsconnectvới React's componentDidUpdate(prevProps, prevState, snapshot)hook.

Vì vậy, về cơ bản mã của bạn có thể trông như thế này:

const mapStateToProps = (state) => ({ 
   specificProperty: state.specificProperty,
   // any props you need else
});

class YourComponent extends React.Component {
    render() {
      // render your component  
    }

    componentDidUpdate(prevProps, prevState, snapshot) {
        if (prevProps.specificProperty !== this.props.specificProperty) {
            // Do whatever you want
        }
    }
}

YourComponent = connect(mapStateToProps)(YourComponent);

2
Phù hợp với các thẻ được cung cấp, sau đó
hellogoodnight

2
Đẹp. Ngoài ra, có thể có lỗi đánh máy? Ý bạn là nextProps.specificProperty !== this.props.specificPropertygì?
python1981

1
@BrunoCarvalhal, nếu bạn không sử dụng phản ứng có thể là một lựa chọn tốt hơn, tùy thuộc vào khung JS của bạn, hơn Redux;)
FabienChn

4
Cập nhật nhỏ cho điều này, componentWillUpdatekhông còn được sử dụng với React 16. getDerivedStateFromProps hiện là cách tiếp cận được khuyến nghị.
wootencl

4
Tùy thuộc - có thể là getDerivedStateFromPropsnếu bạn muốn trạng thái mới, nhưng có thể là bạn muốn sử dụng componentDidUpdateđể linh hoạt hơn một chút.
Jonny Rathbone
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.