मैं दान Abramov (प्रतिक्रिया कोर अनुरक्षकों में से एक) को यहां देखने का सुझाव देता हूं :
मुझे लगता है कि आप इसे ज़रूरत से ज़्यादा जटिल बना रहे हैं।
function Example() {
const [data, dataSet] = useState<any>(null)
useEffect(() => {
async function fetchMyAPI() {
let response = await fetch('api/data')
response = await response.json()
dataSet(response)
}
fetchMyAPI()
}, [])
return <div>{JSON.stringify(data)}</div>
}
लंबे समय तक हम इस पैटर्न को हतोत्साहित करेंगे क्योंकि यह दौड़ की स्थिति को प्रोत्साहित करता है। जैसे - आपके कॉल के शुरू होने और समाप्त होने के बीच कुछ भी हो सकता है, और आप नए प्रॉप्स प्राप्त कर सकते हैं। इसके बजाय, हम डेटा लाने के लिए सस्पेंस की सिफारिश करेंगे जो अधिक पसंद आएगा
const response = MyAPIResource.read();
और कोई प्रभाव नहीं। लेकिन इस बीच आप एसिंक्स सामान को एक अलग फ़ंक्शन में स्थानांतरित कर सकते हैं और इसे कॉल कर सकते हैं।
आप प्रायोगिक रहस्य के बारे में अधिक पढ़ सकते हैं ।
यदि आप एस्किल्ट के साथ बाहर के कार्यों का उपयोग करना चाहते हैं।
function OutsideUsageExample() {
const [data, dataSet] = useState<any>(null)
const fetchMyAPI = useCallback(async () => {
let response = await fetch('api/data')
response = await response.json()
dataSet(response)
}, [])
useEffect(() => {
fetchMyAPI()
}, [fetchMyAPI])
return (
<div>
<div>data: {JSON.stringify(data)}</div>
<div>
<button onClick={fetchMyAPI}>manual fetch</button>
</div>
</div>
)
}
UseCallback साथ useCallback । सैंडबॉक्स ।
import React, { useState, useEffect, useCallback } from "react";
export default function App() {
const [counter, setCounter] = useState(1);
// if counter is changed, than fn will be updated with new counter value
const fn = useCallback(() => {
setCounter(counter + 1);
}, [counter]);
// if counter is changed, than fn will not be updated and counter will be always 1 inside fn
/*const fnBad = useCallback(() => {
setCounter(counter + 1);
}, []);*/
// if fn or counter is changed, than useEffect will rerun
useEffect(() => {
if (!(counter % 2)) return; // this will stop the loop if counter is not even
fn();
}, [fn, counter]);
// this will be infinite loop because fn is always changing with new counter value
/*useEffect(() => {
fn();
}, [fn]);*/
return (
<div>
<div>Counter is {counter}</div>
<button onClick={fn}>add +1 count</button>
</div>
);
}
useEffect(() => { let unmounted = false promise.then(res => { if (!unmounted) { setState(...) } }) return () => { unmounted = true } }, [])