จะรับบางสิ่งจากรัฐ / ร้านค้าภายในฟังก์ชัน redux-saga ได้อย่างไร?


คำตอบ:


211

ตามที่ @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


3
ตรงตามที่ฉันต้องการ .. ไม่น่าเชื่อว่าพลาดไป
Adam Tal

30

นี่คือฟังก์ชัน "ตัวเลือก" สำหรับ คุณส่งต้นไม้สถานะทั้งหมดให้พวกเขาและพวกเขาก็ส่งคืนบางส่วนของรัฐ รหัสที่เรียกตัวเลือกไม่จำเป็นต้องรู้ว่าข้อมูลนั้นอยู่ที่ใดในสถานะเพียงแค่ส่งคืนข้อมูล ดูhttp://redux.js.org/docs/recipes/ComputingDerivedData.htmlสำหรับตัวอย่างบางส่วน

ภายในเทพนิยายselect()APIสามารถใช้เพื่อเรียกใช้งานตัวเลือกได้


เป็นเรื่องที่น่าสนใจว่าสิ่งนี้ถูกเขียนขึ้นอย่างไร 3.5 ชั่วโมงก่อนคำตอบที่ยอมรับ แต่ไม่ได้ให้ตัวอย่างดังนั้นจึงไม่ได้รับการยอมรับ ขอบคุณอย่างไรก็ตาม!
Aleksandar

1
@ แคสเปอร์ - ยอมแล้ว! แต่ไม่เกี่ยวกับว่าคุณตอบคำถามเร็วแค่ไหนที่นี่ แต่คำตอบของคุณดีแค่ไหน ฉันคิดว่าคำตอบจะต้องเรียบง่ายและอ่านง่าย คำตอบนี้ไม่ตรงกับที่ตอบและคำตอบที่ยอมรับนั้นเข้าใจง่ายกว่ามาก
Adam Tal

@AdamTal ใช่ฉันเห็นด้วย :)
Aleksandar

2

ฉันใช้ 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)
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.