Câu trả lời:
Như @markerikson đã nói, redux-saga
cho thấy một API rất hữu ích select()
để gọi một selector
trạng thái trên để đưa một số phần của nó có sẵn bên trong saga.
Đối với ví dụ của bạn, một triển khai đơn giản có thể là:
/*
* Selector. The query depends by the state shape
*/
export const getProject = (state) => state.project
// Saga
export function* saveProjectTask() {
while(true) {
yield take(SAVE_PROJECT);
let project = yield select(getProject); // <-- get the project
yield call(fetch, '/api/project', { body: project, method: 'PUT' });
yield put({type: SAVE_PROJECT_SUCCESS});
}
}
Ngoài tài liệu được gợi ý bởi @markerikson, có một video hướng dẫn rất hay của D. Abramov giải thích cách sử dụng selectors
với Redux. Cũng kiểm tra chủ đề thú vị này trên Twitter.
Đây là chức năng của "bộ chọn". Bạn chuyển cho chúng toàn bộ cây trạng thái và chúng trả về một số phần của trạng thái. Mã gọi bộ chọn không cần biết dữ liệu đó ở trạng thái nào, chỉ cần nó được trả về. Xem http://redux.js.org/docs/recipes/ComputingDerivedData.html để biết một số ví dụ.
Trong một câu chuyện, select()
API có thể được sử dụng để thực thi một bộ chọn.
Tôi đã sử dụng eventChannel để gửi một hành động từ một lệnh gọi lại trong hàm trình tạo
import {eventChannel} from 'redux-saga';
import {call, take} from 'redux-saga/effects';
function createEventChannel(setEmitter) {
return eventChannel(emitter => {
setEmitter(emitter)
return () => {
}
}
)
}
function* YourSaga(){
let emitter;
const internalEvents = yield call(createEventChannel, em => emitter = em)
const scopedCallback = () => {
emitter({type, payload})
}
while(true){
const action = yield take(internalEvents)
yield put(action)
}
}