प्रतिक्रियाशील और Reduxदोनों को शुद्ध अंदाज की जरूरत होती है ताकि वे अंदाज से अंदाजा लगा सकें कि वे एक प्रेडिक्टेबल फैशन में चल रहे हैं।
यदि आप इन दो चीजों का पालन नहीं करते हैं, तो आपके ऐप में बग होंगे, सबसे आम React/Reduxबदलावों को ट्रैक करने में सक्षम नहीं है और आपके state/propपरिवर्तनों को फिर से प्रस्तुत करने में असमर्थ हैं।
प्रतिक्रिया के संदर्भ में, निम्नलिखित उदाहरण पर विचार करें:
let state = {
add: 0,
}
function render() {
//...
}
//pure function
function effects(state,action) {
//following immutability while updating state, not directly mutating the state.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
function shouldUpdate(s) {
if(s === state){
return false
}
return true
}
state = effects(state, 'addTen')if(shouldUpdate(state)) {
render();
}
राज्य को राज्य वस्तु द्वारा धारण किया जाता है जिसने केवल संपत्ति को जोड़ा है। यह ऐप ऐप प्रॉपर्टी को रेंडर करता है। यह हमेशा कुछ भी होने पर राज्य को प्रस्तुत नहीं करना चाहिए, लेकिन यह जांचना चाहिए कि क्या राज्य वस्तु में कोई परिवर्तन हुआ है।
जैसे, हमारे पास एक प्रभाव कार्य है, pure functionजिसका उपयोग हम अपने राज्य को प्रभावित करने के लिए करते हैं। आप देखते हैं कि यह एक नया राज्य लौटाता है जब राज्य को बदलना होता है और उसी राज्य को वापस करता है जब कोई संशोधन की आवश्यकता नहीं होती है।
हमारे पास एक shouldUpdateफ़ंक्शन भी है जो === ऑपरेटर का उपयोग करके जांचता है कि क्या पुराना राज्य और नया राज्य समान है।
प्रतिक्रिया के संदर्भ में गलतियाँ करने के लिए, आप वास्तव में निम्न कार्य कर सकते हैं:
function effects(state,action) {
doRandom(); // effects should only be called for updating state.
// Doing any other stuff here would make effects impure.
if(action == 'addTen') {
return {...state, add: state.add + 10}
}
return state;
}
आप राज्य को सीधे सेट करके और effectsफ़ंक्शन का उपयोग न करके भी गलतियाँ कर सकते हैं ।
function doMistake(newValue) {
this.state = newValue
}
ऊपर नहीं किया effectsजाना चाहिए और राज्य को अपडेट करने के लिए केवल फ़ंक्शन का उपयोग किया जाना चाहिए।
प्रतिक्रिया के संदर्भ में, हम फोन effectsके रूप में setState।
Redux के लिए:
combineReducersसंदर्भ परिवर्तनों के लिए Redux की उपयोगिता जांचती है ।
- रिएक्ट-रेडक्स की
connectविधि उन घटकों को उत्पन्न करती है जो रूट स्टेट दोनों के लिए संदर्भ परिवर्तन की जांच करती है और mapStateफ़ंक्शन से रिटर्न मान देखने के लिए कि क्या लिपटे घटक को वास्तव में फिर से प्रस्तुत करने की आवश्यकता है।
- टाइम-ट्रैवल डिबगिंग के लिए आवश्यक है कि रिड्यूसर
pure functionsबिना किसी साइड इफेक्ट के हो ताकि आप सही तरीके से विभिन्न राज्यों के बीच कूद सकें।
आप रिड्यूसर के रूप में अशुद्ध कार्यों का उपयोग करके आसानी से उपरोक्त तीनों का उल्लंघन कर सकते हैं।
निम्नलिखित को सीधे redux डॉक्स से लिया गया है:
इसे एक reducer कहा जाता है क्योंकि यह फ़ंक्शन का प्रकार है जिसे आप पास करेंगे Array.prototype.reduce(reducer, ?initialValue)।
यह बहुत महत्वपूर्ण है कि reducer शुद्ध रहता है। ऐसी चीजें जो आपको किसी रेड्यूसर के अंदर नहीं करनी चाहिए
Mutate its arguments;
Perform side effects like API calls and routing transitions;
Call non-pure functions, e.g. Date.now() or Math.random().
उसी तर्कों को देखते हुए, इसे अगले राज्य की गणना करनी चाहिए और इसे वापस करना चाहिए। कोई आश्चर्य नहीं। कोई दुष्प्रभाव नहीं। कोई एपीआई कॉल नहीं। कोई उत्परिवर्तन नहीं। सिर्फ एक गणना।
window.getElementByIdइसी तरह के मापदंडों के आधार पर समान फ़ंक्शन के साथ एक ही फ़ंक्शन चलाने के विभिन्न परिणाम हो सकते हैं। वह जगह है जहाँ Redux विफल होगा।