मेरे कई घटकों में, मुझे डेटा प्राप्त करने और उसका प्रतिनिधित्व करने के लिए स्टोर से टोकन का उपयोग करना पड़ता है (शीर्षलेख मेनू, पाद लेख मेनू, पृष्ठ पर उत्पाद, स्लाइडर छवियां, आदि)। मैं जो करने की कोशिश कर रहा हूं वह यह डेटा केवल तभी प्राप्त करना है जब मेरे पास यह नहीं है, लेकिन प्रतिक्रिया हर बार टोकन परिवर्तन (टोकन निर्भरता के रूप में) अनुरोध भेजती रहती है, भले ही मैं स्पष्ट रूप से शर्त रखता हूं और मैं इसे देख सकता हूं अगर मैं सांत्वना देता हूं लॉग इन करें। मैं क्या गलत कर रहा हूं?

const [cities, setCities] = useState([]);

useEffect(() => {
 if (!cities.length) {
  fetch(`.....&token=${props.token}`)
  .then(response => response.json())
  .then(data => {

    if (data.data.results) {
    setCities(data.data.results.cities)

    }
   })
  }
}, [props.token, cities.length]);
6
LotusFlower 27 नवम्बर 2019, 21:06
चूंकि आप प्रत्येक पुन: प्रस्तुत करने पर cities सेट करते हैं, cities हमेशा एक नई वस्तु होती है, इस प्रकार cities.length पिछले वाले के समान नहीं होता है। साथ ही if(!cities.length) हमेशा सत्य होता है क्योंकि cities हमेशा परिभाषित होता है, शुरुआत में लंबाई 0 होती है, जो अभी भी सच होती है। इसके बजाय आप क्या कर सकते हैं if(cities.length<1)
 – 
oemera
27 नवम्बर 2019, 21:16

2 जवाब

cities वैसे भी पहले रेंडर पर खाली होगा, इसलिए आपको इसकी लंबाई की जांच करने और इसे एक निर्भरता के रूप में निर्दिष्ट करने की आवश्यकता नहीं है:

const [cities, setCities] = useState([]);

useEffect(() => {
  fetch(`.....&token=${props.token}`)
    .then(response => response.json())
    .then(data => {
      if (data.data.results) {
        setCities(data.data.results.cities)
      }
    })
}, [props.token]);

useEffect कॉलबैक को ट्रिगर करने से रोकने के लिए आप टोकन को याद भी कर सकते हैं:

const token = useMemo(() => props.token, []);
2
Clarity 27 नवम्बर 2019, 21:21

// टिप्पणियों के कारण संपादित

// should be outside of the function
let timesExecuted = 0

function fetch () {
useEffect(() => {
if(props.token){
 timesExecuted = timesExecuted + 1
}

if (timesExecuted === 1) {
  fetch(`.....&token=${props.token}`)
  .then(response => response.json())
  .then(data => {

    if (data.data.results) {
    setCities(data.data.results.cities)
    }
   })
  }
}, [props.token]);
}

तो यह हर बार आएगा लेकिन केवल तभी निष्पादित किया जाएगा जब प्रोप.टोकन ठीक है (टोकन सत्यापन के आधार पर पहले आईएफ को संशोधित करने के लिए स्वतंत्र महसूस करें)।

0
Renaldo Balaj 27 नवम्बर 2019, 23:17
यह सुनिश्चित करना है कि टोकन है, क्योंकि टोकन अन्य घटक में भी अनुरोध किया जाता है।
 – 
LotusFlower
27 नवम्बर 2019, 21:17
क्या आपको हर बार टोकन बदलने पर शहरों को प्राप्त करने की आवश्यकता है? या आपको इसे केवल 1 बार चाहिए?
 – 
Renaldo Balaj
27 नवम्बर 2019, 21:20
केवल एक बार, लेकिन मुझे नहीं पता कि मेरे स्टोर में पहले से ही टोकन है या नहीं क्योंकि ऐप माउंट होने पर भी इसका अनुरोध किया जाता है। तो मूल रूप से मुझे इसे निर्भरता के रूप में चाहिए, इसलिए जब यह वहां होता है, तो मैं अनुरोध भेजता हूं।
 – 
LotusFlower
27 नवम्बर 2019, 21:36
क्या मैंने आपकी आवश्यकताओं के आधार पर अपना उत्तर संपादित किया है, अगर यह काम करता है तो समाधान उत्तर के रूप में ऊपर उठाने और चिह्नित करने के लिए स्वतंत्र महसूस करें
 – 
Renaldo Balaj
27 नवम्बर 2019, 23:17