2016-02-25 17 views
30

में विशिष्ट सरणी आइटम के अंदर एकल मान को अपडेट करने के लिए कैसे करें मुझे एक समस्या है जहां राज्य के पुन: प्रस्तुत करने से ui मुद्दों का कारण बनता है और मुझे पृष्ठ पर पुन: प्रस्तुत करने की मात्रा को कम करने के लिए केवल मेरे reducer के अंदर विशिष्ट मान को अपडेट करने का सुझाव दिया गया था।रेडक्स

यह मेरा राज्य

{ 
name: "some name", 
subtitle: "some subtitle", 
contents: [ 
    {title: "some title", text: "some text"}, 
    {title: "some other title", text: "some other text"} 
] 
} 

का उदाहरण है और मैं इस समय इस

case 'SOME_ACTION': 
    return { ...state, contents: action.payload } 

जहां action.payload नए मूल्यों से युक्त एक पूरी सरणी है जैसे कि यह अद्यतन करने कर रहा हूँ। लेकिन अब मैं वास्तव में सिर्फ सामग्री सरणी में दूसरा आइटम का पाठ अद्यतन करने की आवश्यकता है, और कुछ इस तरह

case 'SOME_ACTION': 
    return { ...state, contents[1].text: action.payload } 

काम नहीं करता है, जहां action.payload अब एक पाठ मैं अद्यतन के लिए की जरूरत है।

उत्तर

14

आप React Immutability helpers

import update from 'react-addons-update'; 

// ...  

case 'SOME_ACTION': 
    return update(state, { 
    contents: { 
     1: { 
     text: {$set: action.payload} 
     } 
    } 
    }); 

इस्तेमाल कर सकते हैं हालांकि मैं कल्पना कर सकते हैं तो आप शायद अधिक कुछ इस तरह कर रही हैं?

case 'SOME_ACTION': 
    return update(state, { 
    contents: { 
     [action.id]: { 
     text: {$set: action.payload} 
     } 
    } 
    }); 
+0

वास्तव में, क्या मुझे इन सहायकों को किसी भी तरह से मेरे reducer के अंदर प्रतिक्रिया से शामिल करने की आवश्यकता है? – Ilja

+0

'प्रतिक्रिया-एडॉन्स-अपडेट' से आयात अपडेट; ' – Clarkie

+3

हालांकि पैकेज को 'कोलोनी/अपरिवर्तनीयता-सहायक' में स्थानांतरित कर दिया गया है, इसलिए अब यह 'अपरिवर्तनीयता-सहायक' या 'अपरिवर्तनीयता-सहायक' से आयात अपडेट है; ' – SacWebDeveloper

4

आप एक पंक्ति में सब कुछ करने की जरूरत नहीं है:

case 'SOME_ACTION': 
    const newState = { ...state }; 
    newState.contents = 
    [ 
     newState.contents[0], 
     {title: newState.contnets[1].title, text: action.payload} 
    ]; 
    return newState 
+0

आप सही हैं, मैंने त्वरित समाधान किया है। बीटीडब्ल्यू, सरणी तय लंबाई है? और वह इंडेक्स है जिसे आप निश्चित रूप से संशोधित करना चाहते हैं? वर्तमान दृष्टिकोण केवल छोटे सरणी और निश्चित सूचकांक के साथ व्यवहार्य है। – Kujira

+0

अपने केस बॉडी को {} में लपेटें, क्योंकि कॉन्स्ट ब्लॉक स्कॉप्ड है। –

51

आप map का उपयोग कर सकते हैं। यहां एक उदाहरण कार्यान्वयन है:

case 'SOME_ACTION': 
    return { 
     ...state, 
     contents: state.contents.map(
      (content, i) => i === 1 ? {...content, text: action.payload} 
            : content 
     ) 
    } 
+0

इस तरह मैं भी कर रहा हूं, मुझे यकीन नहीं है कि यह एक अच्छा दृष्टिकोण है या नहीं, क्योंकि नक्शा एक नई सरणी लौटाएगा। कोई विचार? – Ventura

+0

@ वेंचुरा हां, यह अच्छा है क्योंकि यह सरणी के लिए एक नया संदर्भ बना रहा है और जिसे अपडेट किया जाना है (और केवल एक ही) के लिए एक सादा नई वस्तु है, जो आपको लगता है कि – ivcandela

+0

मुझे लगता है कि यह सबसे अच्छा अप्रासंगिक है –