2016-10-27 9 views
12

का उपयोग कर प्रतिक्रिया स्थिति में सरणी ऑब्जेक्ट को अद्यतन करना मैं immutability helper का उपयोग कर प्रतिक्रिया स्थिति में किसी सरणी के भीतर एक ऑब्जेक्ट अपडेट कर रहा हूं।अपरिवर्तनीय सहायक

वस्तु मैं संशोधित करना चाहते हैं नीडिंत है:

this.state = { 
    a: { 
    b: [{ c: '', d: ''}, ...] 
    } 
} 

मैं अद्यतन करने के लिए अचल स्थिति सहायक का उपयोग कर ख के n वें तत्व के भीतर प्रोप ग चाहते हैं।

अचल स्थिति सहायक के बिना बराबर कोड है:

const newState = Object.assign({}, this.state); 
newState.a = Object.assign({}, newState.a); 
newState.a.b = newState.a.b.slice(); 
newState.a.b[n] = Object.assign({}, newState.a.b[n]); 
newState.a.b[n].c = 'new value'; 
this.setState({ newState }); 

मैं जानता हूँ कि उपरोक्त कोड थोड़ा बदसूरत है। मुझे लगता है कि अपरिवर्तनीय सहायक का उपयोग कर कोड मेरी समस्या का समाधान करेगा। धन्यवाद

+1

ImmutableJS उपयोग करने पर विचार करना है। –

उत्तर

15

एक तरह से इसे का उपयोग किया जाएगा $set

let index = 0; 
let newState = update(this.state, { 
    a: { 
    b: { 
     [index]: { 
       c: { $set: "new value"} 
     } 
    } 
    } 
}); 
this.setState(newState); 

jsfiddle

+0

क्या अद्यतन एक नई ऑब्जेक्ट/तत्व जैसे abc = Object.assign ({}, xyz) देता है या यह स्थान पर पैरामीटर के रूप में दिए गए ऑब्जेक्ट को बदलता है ?? –

+0

@VrajSolanki इस उदाहरण के लिए, यह नई 'ए' ऑब्जेक्ट (बाकी कुंजियां समान, पुरानी संदर्भ) के साथ नई स्टेट ऑब्जेक्ट लौटाएगी, इसमें नए 'बी' सरणी के साथ, सभी तत्व रिफ्रेंस को बदला नहीं जाएगा लेकिन ' [सूचकांक] 'एक। और 'सी' के लिए नए संदर्भ के साथ, बाकी पुराने संदर्भ होंगे। – Wish

2

इम अचल स्थिति सहायक यहां से update का आयात :)

this.state = { 
    a: { 
    b: [{ c: '', d: ''}, ...] 
    } 
} 


this.setState(update(this.state, { 
    a: { 
     b: { 
      $apply: b => b.map((item, ii) => { 
       if(ii !== n) return item; 
       return { 
        ...item, 
        c: 'new value' 
       } 
      }) 
     } 
    } 
}) 
संबंधित मुद्दे