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


मैं एक सागा फ़ंक्शन के अंदर रेडक्स स्थिति का उपयोग कैसे करूं?

मेरी समस्या

मेरे पास निम्नलिखित भागों से युक्त एक आवेदन है:

            TOOLBAR        
 ---------------------------------
 User info     |   Current Project

प्रत्येक भाग अपने स्वयं के reducer, गाथा, क्रियाओं और राज्य के साथ एक अलग घटक है।

टूलबार में एक सेव बटन होता है जो "SAVE_PROJECT" एक्शन प्रकार भेजता है। समस्या यह है कि मैं नहीं चाहता कि टूलबार परियोजना को जान सके (इसमें अधिक जिम्मेदारियां हैं और मैं सिर्फ इसे प्रकार के साथ क्रियाएं भेजना चाहता हूं)।

मेरे पास एक प्रोजेक्ट संबंधित सागा है जो "SAVE_PROJECT" को सुनती है:

...
export function* saveProjectTask() {
  while(true) {
    yield take(SAVE_PROJECT);
    let project = /* THIS IS THE PROBLEM, I DON'T HAVE THE PROJECT */;
    yield call(fetch, '/api/project', { body: project, method: 'PUT' });
    yield put({type: SAVE_PROJECT_SUCCESS});
  }
}

मैं गाथा के अंदर रेडक्स राज्य से परियोजना नहीं प्राप्त कर सकता।

मुझे नहीं लगता कि मैं कर्रेन प्रोजेक्ट रेड्यूसर के अंदर "SAVE_PROJECT" ईवेंट सुन सकता हूं और फिर reducer के अंदर प्रोजेक्ट प्राप्त कर सकता है और प्रोजेक्ट के साथ एक अलग कार्रवाई भेज सकता है।

मैं वास्तव में नहीं चाहता कि मेरी टूलबार पूरे राज्य के पेड़ को जान सके और प्रत्येक कार्रवाई के लिए कार्रवाई से संबंधित कुछ भी भेज सके।

मैं इस राज्य को सागा में कैसे पार कर सकता हूं? या केवल राज्य का प्रासंगिक हिस्सा?


44
2018-06-12 09:53


मूल




जवाब:


जैसा कि @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 द्वारा, बहुत अच्छा है वीडियो ट्यूटोरियल डी। अब्रामोव द्वारा जो बताते हैं कि कैसे उपयोग करें selectors Redux के साथ। यह भी जांचें इस ट्विटर पर दिलचस्प धागा।


98
2018-06-12 22:00



वास्तव में मैं क्या चाहता था .. मैं विश्वास नहीं कर सकता मैं इसे याद किया - Adam Tal


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

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


15
2018-06-12 18:28