मैं एक दस्तावेज़ स्नैपशॉट का उपयोग कर फायरस्टोर से उपयोगकर्ता डेटा प्राप्त करने की कोशिश कर रहा हूं, मैं डेटा प्राप्त कर सकता हूं लेकिन यह एक अनंत लूप में फंस गया है, उपयोगकर्ता डेटा अपडेट कर रहा है,

यहाँ कोड है

import firestore from '@react-native-firebase/firestore';
export default function HomeScreen() {
     const { user, logout } = useContext(AuthContext);
     const [currentUser, setCurrentUser] = useState('');

     useEffect(() => {
      firestore()
           .collection('users')
           .doc(user.uid)
           .get()
           .then(documentSnapshot => {
                if (documentSnapshot.exists) {
                     setCurrentUser(documentSnapshot.data())
                }
           })

 })
 return (
      <View style={styles.container}>
           <Title>{currentUser.displayName}</Title>
           <FormButton
                modeValue='contained'
                title='Logout'
                onPress={() => logout()} />
      </View>
 )
}
0
Peter Snee 12 सितंबर 2020, 18:11

1 उत्तर

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

हर बार जब आप setCurrentUser को कॉल करते हैं तो आप एक रीरेंडर को बाध्य कर रहे होते हैं (क्योंकि यह एक राज्य चर है)। आपका useEffect फिर से सक्रिय होता है, जो setCurrentUser को फिर से कॉल करता है, और इसी तरह, अनंत लूप का कारण बनता है।

इसे रोकने के लिए, आपको वेरिएबल्स की एक सूची सेट करनी चाहिए जो useEffect को फायरिंग से पहले सुननी चाहिए। आप useEffect पर दूसरा पैरामीटर पास करके ऐसा कर सकते हैं।

useEffect(() => {
  // your function call
}, [/* list of state/prop variables to respond to */])

यदि आप चाहते हैं कि useEffect केवल एक बार सक्रिय हो, componentDidMount के समान, तो आप एक खाली सरणी पास कर सकते हैं।

दस्तावेज़ों से:

यदि आप एक प्रभाव चलाना चाहते हैं और इसे केवल एक बार (माउंट और अनमाउंट पर) साफ करना चाहते हैं, तो आप एक खाली सरणी ([]) को दूसरे तर्क के रूप में पास कर सकते हैं। यह रिएक्ट को बताता है कि आपका प्रभाव प्रॉप्स या राज्य के किसी भी मूल्य पर निर्भर नहीं करता है, इसलिए इसे फिर से चलाने की आवश्यकता नहीं है। इसे एक विशेष मामले के रूप में नियंत्रित नहीं किया जाता है - यह सीधे निर्भर करता है कि निर्भरता सरणी हमेशा कैसे काम करती है।

आपके मामले में ऐसा लगता है कि आप इस सरणी में user रखना चाह सकते हैं, क्योंकि यह एकमात्र वैरिएबल है जिस पर आपका फायरस्टोर कॉल निर्भर करता है। यदि user.uid नहीं बदला है, तो इस प्रभाव को फिर से सक्रिय करने का कोई कारण नहीं है।

1
Danny Buonocore 12 सितंबर 2020, 18:38