मैं एक ट्यूटोरियल का अनुसरण कर रहा हूं और अभी-अभी useEffect
के बारे में सीखा है। मेरी समस्या यह है कि मैं result.hours[0].is_open_now
प्राप्त करना चाहता हूं। मैंने पाया है कि घटक दो बार प्रस्तुत करता है, और चूंकि घंटे पहले अपरिभाषित हैं, यह विफल हो जाता है।
क्या इसे केवल एक बार चलाने का कोई तरीका है।
const ResultsShowScreen = ({ navigation }) => {
const id = navigation.getParam('id');
const [result, setResult] = React.useState({})
const getResult = async (id) => {
const response = await yelp.get(`/${id}`)
setResult(response.data)
}
useEffect(() => {
getResult(id)
}, [])
if (!result || result.length <= 0) {
return null
}
const {name,
display_address,
price,
display_phone,
photos,
review_count,
rating,
hours
} = result
if (hours && hours.length > 0 ) {
const is_open_now = hours[0].is_open_now
console.log('running')
} else {
console.log('nooooo')
}
return (
<View>
<Text style={styles.title}>{name}</Text>
<Text>Price: {price}</Text>
<Text>Rating: {rating}</Text>
<Text>Reviews: {review_count}</Text>
<Text>Phone: {display_phone}</Text>
<Text>Is Open Now: </Text>
</View>
)
}
export default ResultsShowScreen
1 उत्तर
अपने कोड का अनुसरण करने से आप useEffect
को दो बार रेंडर होने से नहीं रोक सकते क्योंकि प्रतिक्रिया हुक जीवनचक्र,
यदि आप रिएक्ट क्लास के जीवनचक्र के तरीकों से परिचित हैं, तो आप यूज़इफेक्ट हुक को कंपोनेंटडिडमाउंट, कंपोनेंटडिडअपडेट और कंपोनेंटविलयूनमाउंट संयुक्त के रूप में सोच सकते हैं।
इसका मतलब है useEffect
घटक पहली बार प्रस्तुत करने के बाद निष्पादित किया जाएगा (आपका कोड पहला समय शून्य है) और दूसरे तर्क में मान होने पर अधिक समय निष्पादित किया जाएगा।
अपने useEffect
में, आप setState
को कॉल करके नई स्थिति सेट करते हैं और यदि स्थिति बदलती है तो घटक स्वतः रेंडर हो जाता है। तो आपका घटक कम से कम दो बार प्रस्तुत किया जाएगा।