टी एल; डॉ
बिना combineReducers()या समान मैनुअल कोड के, initialStateहमेशा state = ...reducer पर जीतता है क्योंकि reducer को stateपारित किया गया है initialState और नहीं है undefined , इसलिए ES6 तर्क वाक्यविन्यास इस मामले में लागू नहीं होता है।
combineReducers()व्यवहार के साथ अधिक सूक्ष्म है। उन रिड्यूसर जिनके राज्य में निर्दिष्ट किया गया है, वे initialStateइसे प्राप्त करेंगे state। अन्य रिड्यूसर प्राप्त करेंगे undefined और इसके कारणstate = ... वे निर्दिष्ट किए गए डिफ़ॉल्ट तर्क पर वापस आ जाएंगे ।
सामान्य तौर पर, initialStateरिड्यूसर द्वारा निर्दिष्ट राज्य पर जीत होती है। यह Reducers को प्रारंभिक डेटा निर्दिष्ट करने देता है जो उन्हें डिफ़ॉल्ट तर्क के रूप में समझ में आता है , लेकिन मौजूदा डेटा (पूरी तरह या आंशिक रूप से) को लोड करने की अनुमति देता है जब आप स्टोर को कुछ लगातार भंडारण या सर्वर से हाइड्रेट कर रहे होते हैं।
पहले एक मामले पर विचार करें जहां आपके पास एक एकल reducer है।
कहो तुम उपयोग नहीं करते combineReducers()।
तब आपका रिड्यूसर इस तरह दिख सकता है:
function counter(state = 0, action) {
switch (action.type) {
case 'INCREMENT': return state + 1;
case 'DECREMENT': return state - 1;
default: return state;
}
}
अब मान लेते हैं कि आप इसके साथ एक स्टोर बनाते हैं।
import { createStore } from 'redux';
let store = createStore(counter);
console.log(store.getState());
प्रारंभिक अवस्था शून्य है। क्यों? क्योंकि दूसरा तर्क createStoreथा undefined। यह stateपहली बार आपके reducer को दिया गया है। जब Redux इनिशियलाइज़ करता है तो यह राज्य को भरने के लिए एक "डमी" एक्शन भेजता है। तो अपने counterreducer के stateबराबर बुलाया गया था undefined। यह ठीक यही स्थिति है कि डिफ़ॉल्ट तर्क को "सक्रिय" करता है। इसलिए, stateअब 0डिफ़ॉल्ट stateमान ( state = 0) के अनुसार है। यह राज्य ( 0) वापस कर दिया जाएगा।
आइए एक अलग परिदृश्य पर विचार करें:
import { createStore } from 'redux';
let store = createStore(counter, 42);
console.log(store.getState());
यह समय क्यों है 42, और नहीं है 0? क्योंकि दूसरे तर्क के createStoreसाथ बुलाया गया था 42। यह तर्क stateडमी एक्शन के साथ-साथ आपके रिड्यूसर के पास जाता है। इस बार, stateअपरिभाषित नहीं है (यह 42!), इसलिए ES6 डिफ़ॉल्ट तर्क वाक्यविन्यास का कोई प्रभाव नहीं है। stateहै 42, और 42कम करने से दिया जाता है।
अब एक मामले पर विचार करते हैं जहां आप उपयोग करते हैं combineReducers()।
आपके पास दो रिड्यूसर हैं:
function a(state = 'lol', action) {
return state;
}
function b(state = 'wat', action) {
return state;
}
इस combineReducers({ a, b })तरह से उत्पन्न reducer इस तरह दिखता है:
function combined(state = {}, action) {
return {
a: a(state.a, action),
b: b(state.b, action)
};
}
अगर हम createStoreबिना कॉल करते हैं initialState, तो यह इनिशियलाइज़ करने वाला stateहै {}। इसलिए, state.aऔर जब तक यह कॉल और रिड्यूसर state.bकरेगा तब undefinedतक होगा । दोनों और रिड्यूसर अपने तर्क के रूप में प्राप्त करेंगे , और यदि वे डिफ़ॉल्ट मान निर्दिष्ट करते हैं, तो उन्हें वापस कर दिया जाएगा। यह कैसे संयुक्त reducer पहले आह्वान पर एक राज्य वस्तु देता है ।ababundefined statestate{ a: 'lol', b: 'wat' }
import { createStore } from 'redux';
let store = createStore(combined);
console.log(store.getState());
आइए एक अलग परिदृश्य पर विचार करें:
import { createStore } from 'redux';
let store = createStore(combined, { a: 'horse' });
console.log(store.getState());
अब मैंने initialStateतर्क के रूप में निर्दिष्ट किया createStore()। संयुक्त रिड्यूसर से लौटा राज्य प्रारंभिक स्थिति को जोड़ता है जिसे मैंने aरिड्यूसर के लिए 'wat'डिफ़ॉल्ट तर्क के साथ निर्दिष्ट किया था कि bरिड्यूसर ने खुद को चुना।
आइए याद करें कि संयुक्त रेड्यूसर क्या करता है:
function combined(state = {}, action) {
return {
a: a(state.a, action),
b: b(state.b, action)
};
}
इस मामले में, stateनिर्दिष्ट किया गया था इसलिए यह वापस नहीं आया {}। यह aफ़ील्ड के बराबर एक ऑब्जेक्ट था 'horse', लेकिन bफ़ील्ड के बिना । यही कारण है कि aरिड्यूसर ने 'horse'इसके रूप में प्राप्त किया stateऔर खुशी से इसे वापस कर दिया, लेकिन bरिड्यूसर ने undefinedइसके रूप में प्राप्त किया stateऔर इस तरह डिफ़ॉल्ट के अपने विचार को वापस कर दियाstate (हमारे उदाहरण में, 'wat')। इस तरह हम { a: 'horse', b: 'wat' }बदले में मिलते हैं।
इसे जमा करने के लिए, यदि आप Redux सम्मेलनों से चिपके रहते हैं और जब वे तर्क के undefinedरूप में कहे जाते हैं, तो Reducers से प्रारंभिक स्थिति लौटाते हैं state(इसे लागू करने का सबसे आसान तरीका stateES6 डिफ़ॉल्ट तर्क मान निर्दिष्ट करना है ), आप करने जा रहे हैं संयुक्त reducers के लिए एक अच्छा उपयोगी व्यवहार। वे initialStateउस createStore()फ़ंक्शन में संबंधित मान को पसंद करेंगे जो आप फ़ंक्शन में पास करते हैं, लेकिन यदि आपने कोई पास नहीं किया है, या यदि संबंधित फ़ील्ड सेट नहीं है, stateतो Reducer द्वारा निर्दिष्ट डिफ़ॉल्ट तर्क इसके बजाय चुना जाता है।यह दृष्टिकोण अच्छी तरह से काम करता है क्योंकि यह मौजूदा डेटा के आरंभ और जलयोजन दोनों को प्रदान करता है, लेकिन व्यक्तिगत रीड्यूसर अपने राज्य को रीसेट कर देता है यदि उनका डेटा संरक्षित नहीं था। बेशक आप इस पैटर्न को पुनरावर्ती रूप से लागू कर सकते हैं, जैसा कि आप combineReducers()कई स्तरों पर उपयोग कर सकते हैं , या यहां तक कि रिड्यूसर को मैन्युअल रूप से रिड्यूसर को कॉल करके और उन्हें राज्य के पेड़ का प्रासंगिक हिस्सा दे सकते हैं।
combineReducers। फिर से बहुत-बहुत धन्यवाद।