getState trong redux-saga?


75

Tôi có một cửa hàng với một danh sách các mặt hàng. Khi ứng dụng của tôi tải lần đầu tiên, tôi cần giải mã hóa các mục, cũng như tạo một số đối tượng trong bộ nhớ dựa trên các mục đó. Các mục được lưu trữ trong cửa hàng redux của tôi và được xử lý bởi một itemsReducer.

Tôi đang cố gắng sử dụng redux-saga để xử lý quá trình deserialization, như một tác dụng phụ. Khi tải trang đầu tiên, tôi thực hiện một hành động:

dispatch( deserializeItems() );

Câu chuyện của tôi được thiết lập đơn giản:

function* deserialize( action ) {
    // How to getState here??
    yield put({ type: 'DESERISLIZE_COMPLETE' });
}

function* mySaga() {
    yield* takeEvery( 'DESERIALIZE', deserialize );
}

Trong saga deserialize của tôi, nơi tôi muốn xử lý tác dụng phụ của việc tạo các phiên bản trong bộ nhớ của các mặt hàng của mình, tôi cần đọc dữ liệu hiện có từ cửa hàng. Tôi không chắc làm thế nào để làm điều đó ở đây, hoặc nếu đó là một mô hình tôi thậm chí nên thử với redux-saga.


tại sao bạn muốn đọc dữ liệu từ cửa hàng? bạn không thể chỉ chuyển dữ liệu trong hành động trọng tải?
gpilotino

Câu trả lời:


210

bạn có thể sử dụng hiệu ứng chọn

import {select, ...} from 'redux-saga/effects'

function* deserialize( action ) {
    const state = yield select();
    ....
    yield put({ type: 'DESERIALIZE_COMPLETE' });
}

bạn cũng có thể sử dụng nó với các bộ chọn

const getItems = state => state.items;

function* deserialize( action ) {
    const items = yield select(getItems);
    ....
    yield put({ type: 'DESERIALIZE_COMPLETE' });
}

-6

Hiệu ứng chọn không giúp ích gì cho chúng ta nếu chúng ta sử dụng hàm gọi lại, khi luồng mã không được xử lý bởi Saga. Trong trường hợp này, chỉ cần vượt qua dispatchgetStatetới root saga:

store.runSaga(rootSaga, store.dispatch, store.getState)

Và truyền các tham số cho sagas con

export default function* root(dispatch, getState) { yield all([ fork(loginFlow, dispatch, getState), ]) }

Và sau đó trong các phương pháp xem

export default function* watchSomething(dispatch, getState) ...


Điều này có vẻ giống như một mô hình chống. Redux saga đã là phần mềm trung gian rồi và không cần thứ gì đó kludgy. Hàm gọi lại không được xử lý bởi saga là gì? Làm thế nào để chuyển một cái gì đó VÀO saga giúp một cái gì đó không được xử lý bởi saga?
Yehuda Makarov

Tôi không đồng ý. yield select()chỉ có thể áp dụng tại ngữ cảnh saga. Chỉ có. Saga có thể liên quan đến một số chức năng, thư viện khác với sự tương tác của người dùng thông qua callbacks. Vào thời điểm đó khi lệnh gọi lại được kích hoạt - saga có thể hoàn toàn không xuất hiện. Đây là một cách để sử dụng Store, khi Saga ra ngoài. (ví dụ microservices frontend, cách tiếp cận web thành phần với nhiều cửa hàng, saga, phản ứng và vân vân)
Alex Shwarc
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.