क्या नीचे का राज्य दूसरी पंक्ति से उत्परिवर्तित है?

let state = { a: 1, b: 2, c: 3 };
state = { ...state, c: 4 };

यह राज्य की एक प्रति बना रहा होगा जैसा कि निम्नलिखित दिखाता है और इसलिए इसे नहीं उत्परिवर्तित होना चाहिए उदा।

let state = { a: 1, b: 2, c: 3 };
let old = state;

state = { ...state, c: 4 };
let newState = state;

console.log(old);
console.log(newState);

प्रत्येक कंसोल लॉग के लिए निम्न आउटपुट के साथ

{ए: 1, बी: 2, सी: 3}

{ए: 1, बी: 2, सी: 4}

क्या यह रिएक्ट सेटस्टेट के संदर्भ में इस्तेमाल किया जाना ठीक है?

-1
rnk 2 अप्रैल 2018, 02:10

3 जवाब

सबसे बढ़िया उत्तर

नहीं, इसे उत्परिवर्तित नहीं किया जा रहा है। इसे एक नई वस्तु के रूप में पुन: असाइन किया जा रहा है। यह पिछली स्थिति के संदर्भों के साथ एक प्रति बना रहा है। इसे उसी तरह से सोचें जैसे concat

let arr = [1,2]
arr = arr.concat([2])

यह arr का उत्परिवर्तन नहीं है। यह एक नई सरणी है जिसके साथ आपने पिछले चर को अधिलेखित करने का निर्णय लिया है।

0
Andrew 1 अप्रैल 2018, 23:35

जैसा कि टिप्पणियों में बताया गया है, आपकी समस्या केवल एक अवैध आरक्षित कीवर्ड (new)।

इसके अलावा यहां आपके कोड नमूने में ऑब्जेक्ट संदर्भों में हेरफेर करते समय क्या हो रहा है, इसका स्पष्टीकरण दिया गया है:

let state = { a: 1, b: 2, c: 3 };

let old = state; // the variable named "old" points (in memory)
                 // to the same reference as the variable named "state"
                 // (let's call this content "object A").
                 // If the common content they refer to is modified
                 // via the use of either variable,
                 // the same (unique) memory space is modified.

state = { ...state, c: 4 }; // Now the variable named "state"
                            // points to a new object (let's call this content "object B"),
                            // that was just created using the literal object notation. 
let newState = state; // the new variable named "newState"
                      // points to the same object as the variable
                      // named "state": "object B".

console.log(old); // displays object A
console.log(newState); // displays object B
-1
Sébastien 2 अप्रैल 2018, 15:57

यदि आप स्पष्ट नहीं हैं कि जावास्क्रिप्ट वस्तुओं को संदर्भ के रूप में कैसे मानता है, तो एक नज़र डालें यहां.

प्रश्न के पहले भाग का उत्तर देने के लिए, नहीं, state को उत्परिवर्तित नहीं किया जा रहा है। मुझे लगता है कि रिएक्ट के संबंध में आप जानते हैं कि आपको सीधे एक घटक स्थिति को संशोधित नहीं करना चाहिए, उदा

this.state.foo = 'bar'

क्योंकि रिएक्ट को पता नहीं चलेगा कि आपने इसे संशोधित किया है और इसलिए रेंडर चक्र को ट्रिगर नहीं करेगा।

अवयव setState विधि का उपयोग किया जाना चाहिए, और उथले विलय गुण होंगे, इसलिए:

this.setState({ c: 4 })

आपकी प्रारंभिक स्थिति को इस प्रकार संशोधित करेगा कि:

{
  a: 1,
  b: 2,
  c: 4,
}

इसलिए, setState को कॉल करने से पहले आपको राज्य की अपनी स्वयं की उत्परिवर्तित प्रति बनाने की कोई आवश्यकता नहीं है।

1
Dave Meehan 2 अप्रैल 2018, 13:47