ฉันจะเข้าถึงสถานะ redux ภายในฟังก์ชัน saga ได้อย่างไร
คำตอบสั้น ๆ :
import { select } from 'redux-saga/effects';
...
let data = yield select(stateSelectorFunction);
ฉันจะเข้าถึงสถานะ redux ภายในฟังก์ชัน saga ได้อย่างไร
คำตอบสั้น ๆ :
import { select } from 'redux-saga/effects';
...
let data = yield select(stateSelectorFunction);
คำตอบ:
ตามที่ @markerikson ได้กล่าวไว้แล้วให้redux-saga
เปิดเผย API ที่มีประโยชน์มากselect()
เพื่อเรียกใช้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 แล้วยังมีวิดีโอสอนที่ดีมากโดย D. Abramov ซึ่งอธิบายวิธีใช้selectors
กับ Redux ตรวจสอบหัวข้อที่น่าสนใจนี้บน Twitter
นี่คือฟังก์ชัน "ตัวเลือก" สำหรับ คุณส่งต้นไม้สถานะทั้งหมดให้พวกเขาและพวกเขาก็ส่งคืนบางส่วนของรัฐ รหัสที่เรียกตัวเลือกไม่จำเป็นต้องรู้ว่าข้อมูลนั้นอยู่ที่ใดในสถานะเพียงแค่ส่งคืนข้อมูล ดูhttp://redux.js.org/docs/recipes/ComputingDerivedData.htmlสำหรับตัวอย่างบางส่วน
ภายในเทพนิยาย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)
}
}