Redux-saga फ़ंक्शन के अंदर राज्य / स्टोर से कुछ कैसे प्राप्त करें?


121

मैं एक गाथा फ़ंक्शन के अंदर redux राज्य तक कैसे पहुंच सकता हूं?

संक्षिप्त जवाब:

import { select } from 'redux-saga/effects';
...
let data = yield select(stateSelectorFunction);

जवाबों:


209

जैसा कि @markerikson पहले से ही कहते हैं, गाथा के अंदर इसका कुछ हिस्सा उपलब्ध होने के लिए राज्य पर आह्वान करने के लिए redux-sagaएक बहुत ही उपयोगी एपीआई 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 से, वहाँ एक बहुत अच्छा है वीडियो ट्यूटोरियल डी अब्रामोव द्वारा जो बताते हैं उपयोग करने के लिए कैसे selectorsRedux साथ। इस दिलचस्प सूत्र को ट्विटर पर भी देखें ।


3
वास्तव में मैं जो चाहता था .. मैं विश्वास नहीं कर सकता मैं इसे याद किया
एडम ताल

28

यह "चयनकर्ता" फ़ंक्शन के लिए है। आप उन्हें पूरे राज्य के पेड़ से गुजरते हैं, और वे राज्य का कुछ टुकड़ा वापस करते हैं। चयनकर्ता को कॉल करने वाले कोड को यह जानने की आवश्यकता नहीं है कि डेटा कहां था, बस उसी स्थिति में उसे लौटा दिया गया था। कुछ उदाहरणों के लिए http://redux.js.org/docs/recipes/ComputingDerivedData.html देखें ।

एक गाथा के भीतर, select()एपीआई का उपयोग चयनकर्ता को निष्पादित करने के लिए किया जा सकता है।


यह दिलचस्प है कि यह स्वीकृत उत्तर से 3.5 घंटे पहले कैसे लिखा गया था , लेकिन यह एक उदाहरण प्रदान नहीं करता था, इसलिए यह स्वीकार करने में विफल रहा। वैसे भी शुक्रिया!
अलेक्जेंडार

1
@ कैस्पर - मैं सहमत हूँ! लेकिन यह इस बारे में नहीं है कि आप यहां किसी प्रश्न का उत्तर कितनी तेजी से देते हैं, लेकिन आपका उत्तर कितना अच्छा है। मुझे लगता है कि उत्तरों को सरल और पढ़ने में आसान रखा जाना चाहिए। यह उत्तर मेल नहीं खाता था और स्वीकृत उत्तर समझने में बहुत आसान था।
एडम टैल

@ एडमटाल हां, मैं सहमत हूं :)
अलेक्जेंडर

2

मैंने जनरेटर फ़ंक्शन के भीतर कॉलबैक से एक कार्रवाई को भेजने के लिए एक इवेंटचैनल का उपयोग किया

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)
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.