टी एल; डॉ
बिना 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 इनिशियलाइज़ करता है तो यह राज्य को भरने के लिए एक "डमी" एक्शन भेजता है। तो अपने counter
reducer के 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 पहले आह्वान पर एक राज्य वस्तु देता है ।a
b
a
b
undefined
state
state
{ 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
(इसे लागू करने का सबसे आसान तरीका state
ES6 डिफ़ॉल्ट तर्क मान निर्दिष्ट करना है ), आप करने जा रहे हैं संयुक्त reducers के लिए एक अच्छा उपयोगी व्यवहार। वे initialState
उस createStore()
फ़ंक्शन में संबंधित मान को पसंद करेंगे जो आप फ़ंक्शन में पास करते हैं, लेकिन यदि आपने कोई पास नहीं किया है, या यदि संबंधित फ़ील्ड सेट नहीं है, state
तो Reducer द्वारा निर्दिष्ट डिफ़ॉल्ट तर्क इसके बजाय चुना जाता है।यह दृष्टिकोण अच्छी तरह से काम करता है क्योंकि यह मौजूदा डेटा के आरंभ और जलयोजन दोनों को प्रदान करता है, लेकिन व्यक्तिगत रीड्यूसर अपने राज्य को रीसेट कर देता है यदि उनका डेटा संरक्षित नहीं था। बेशक आप इस पैटर्न को पुनरावर्ती रूप से लागू कर सकते हैं, जैसा कि आप combineReducers()
कई स्तरों पर उपयोग कर सकते हैं , या यहां तक कि रिड्यूसर को मैन्युअल रूप से रिड्यूसर को कॉल करके और उन्हें राज्य के पेड़ का प्रासंगिक हिस्सा दे सकते हैं।
combineReducers
। फिर से बहुत-बहुत धन्यवाद।