अस्वीकरण
प्रतिक्रिया में नेस्टेड राज्य गलत डिजाइन है
पढ़िए यह बेहतरीन जवाब ।
इस उत्तर के पीछे तर्क:
रिएक्ट का सेटस्टेट केवल एक अंतर्निहित सुविधा है, लेकिन आपको जल्द ही पता चलता है कि इसकी सीमाएं हैं। कस्टम गुणों का उपयोग करना और ForceUpdate का बुद्धिमान उपयोग आपको बहुत अधिक देता है। उदाहरण के लिए:
class MyClass extends React.Component {
myState = someObject
inputValue = 42
...
MobX, उदाहरण के लिए, पूरी तरह से टाँके लगाता है और कस्टम अवलोकन योग्य गुणों का उपयोग करता है।
प्रतिक्रिया घटकों में राज्य के बजाय वेधशालाओं का उपयोग करें।
जो भी नेस्टेड संपत्ति अद्यतन करने के लिए एक और छोटा तरीका है।
this.setState(state => {
state.nested.flag = false
state.another.deep.prop = true
return state
})
एक लाइन पर
this.setState(state => (state.nested.flag = false, state))
नोट: यह यहां कोमा ऑपरेटर ~ एमडीएन है , इसे यहां (सैंडबॉक्स) कार्रवाई में देखें ।
यह (हालांकि यह राज्य संदर्भ नहीं बदलता है) के समान है
this.state.nested.flag = false
this.forceUpdate()
इस संदर्भ में सूक्ष्म अंतर के लिए forceUpdate
और setState
जुड़ा हुआ उदाहरण देखें।
बेशक यह कुछ मुख्य सिद्धांतों का दुरुपयोग कर रहा है, जैसा कि state
केवल पढ़ा जाना चाहिए, लेकिन चूंकि आप तुरंत पुरानी स्थिति को छोड़ रहे हैं और इसे नए राज्य के साथ बदल रहे हैं, यह पूरी तरह से ठीक है।
चेतावनी
यहां तक कि घटक राज्य युक्त हालांकि होगा अद्यतन और rerender ठीक से ( यह पकड़ लिया छोड़कर ) , सहारा होगा असफल बच्चों को प्रचार करने के लिए (नीचे spymaster की टिप्पणी देखें) । केवल इस तकनीक का उपयोग करें यदि आप जानते हैं कि आप क्या कर रहे हैं।
उदाहरण के लिए, आप एक परिवर्तित फ्लैट प्रोप को पास कर सकते हैं जिसे अपडेट किया गया है और आसानी से पास किया गया है।
render(
//some complex render with your nested state
<ChildComponent complexNestedProp={this.state.nested} pleaseRerender={Math.random()}/>
)
अब भले ही complexNestedProp के लिए संदर्भ नहीं बदला है ( shouldComponentUpdate )
this.props.complexNestedProp === nextProps.complexNestedProp
जब भी मूल घटक अपडेट होता है, जो कॉल करने के बाद या माता-पिता में होता है, तो घटक फिर से प्रस्तुत करेगा ।this.setState
this.forceUpdate
राज्य को उत्परिवर्तित करने के प्रभाव
का उपयोग करते हुए नेस्टेड राज्य और सीधे राज्य परिवर्तनशील खतरनाक है क्योंकि विभिन्न वस्तुओं पैदा हो सकती हैं (जानबूझकर या बगैर) अलग (पुराने) के लिए संदर्भ राज्य और जरूरी जब अद्यतन करने के लिए पता नहीं हो सकता है (उदाहरण के लिए उपयोग करते समय PureComponent
या अगर shouldComponentUpdate
वापसी के लिए लागू किया जाता है false
) या कर रहे हैं नीचे दिए गए उदाहरण में पुराने डेटा को प्रदर्शित करने का इरादा है।
ऐतिहासिक डेटा को प्रस्तुत करने के लिए माना जाता है कि एक समयरेखा, हाथ के नीचे डेटा उत्परिवर्तन अप्रत्याशित व्यवहार में परिणाम होगा क्योंकि यह भी पिछले आइटम बदल जाएगा।
वैसे भी यहाँ आप देख सकते हैं कि Nested PureChildClass
यह प्रचार करने में विफल होने के कारण पुन: नहीं चढ़ा।