saga 함수 내에서 redux 상태에 어떻게 액세스합니까?
짧은 답변:
import { select } from 'redux-saga/effects';
...
let data = yield select(stateSelectorFunction);
답변
@markerikson이 이미 말했듯이, redux-saga
는 사가 내에서 일부를 사용할 수 있도록 상태 select()
를 호출하는 데 매우 유용한 API 를 selector
제공합니다.
예를 들어 간단한 구현은 다음과 같습니다.
/*
* 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});
}
}
@markerikson 이 제안한 문서 외에도 Redux와 함께 사용하는 방법을 설명하는 D. Abramov 의 매우 좋은 비디오 자습서 가 있습니다 selectors
. Twitter 에서이 흥미로운 스레드를 확인하십시오 .
답변
이것이 “선택기”기능의 용도입니다. 전체 상태 트리를 전달하고 상태의 일부를 반환합니다. 선택기를 호출하는 코드는 알 필요가없는 곳 이 반환 단지, 데이터가 있었다 상태에서. 몇 가지 예는 http://redux.js.org/docs/recipes/ComputingDerivedData.html 을 참조하십시오 .
saga 내에서 select()
API 를 사용하여 선택기를 실행할 수 있습니다.
답변
eventChannel을 사용하여 생성기 함수 내의 콜백에서 작업을 전달했습니다.
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)
}
}