मैं एक कोड पर काम कर रहा हूं जहां मेरे पास एक खाली सरणी है जिसे एक निश्चित अनुरोध रिटर्न के बाद भरना है।

मैंने इस तरह की सरणी के setState की कोशिश की:

const [recentTransactionContacts,setRecentTransactionContacts] = useState<object[]>([])
///// more code

Contacts.getAll((err, contacts) => {
       if(err) throw err
                    
       if(contacts.length > 0)
           setRecentTransactionContacts(prevState => ({...prevState.recentTransactionContacts, ...contacts}));
       else 
           ToastAndroid.show(`There no contacts on your phone. Can't transfer`, ToastAndroid.SHORT) 
})

अब, मुझे इस तरह से setState करने का प्रयास करने के बाद संपर्कों की सरणी में कोई बदलाव नहीं दिख रहा है। एकमात्र तरीका, जिससे मैं राज्य को अपडेट कर सकता था, वह था:

setRecentTransactionContacts(contacts)

हालांकि, मुझे नहीं लगता कि बाद वाला सही तरीका है।

किसी सरणी की स्थिति को अद्यतन करने का सही तरीका क्या है?

0
Keselme 23 पद 2020, 12:49

2 जवाब

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

मुझे लगता है कि यह आपके मामले की सेवा की जानी चाहिए, इस लाइन के चलने के बाद recentTransactionContacts को नहीं बदला गया है, इसलिए आपको जो करना है उसे करने के लिए आपको prevState तक पहुंचने की आवश्यकता नहीं है।

setRecentTransactionContacts([...recentTransactionContacts, ...contacts]);
1
thelonglqd 23 पद 2020, 12:54

उन मामलों में prevState या updater function का उपयोग करना आवश्यक है जहां वर्तमान स्थिति बदली या पुरानी हो सकती है, जो यहाँ नहीं है। असल में यह prevState ही समस्याएं पैदा कर सकता है, क्योंकि prevState मान चलने पर undefined हो सकता है।

जैसा कि कहा गया है, अपनी विधि को प्रतिस्थापित करें setRecentTransactionContacts([...recentTransactionContacts, ...contacts]); जो वर्तमान स्थिति मान लेगा और संपर्कों को राज्य से जोड़ देगा।

1
Yashank 23 पद 2020, 13:20