#javascript #reactjs #axios #react-hooks #use-effect
#javascript #reactjs #аксиос #реагирующие крючки #эффект использования
Вопрос:
Я использую перехват реакции для извлечения данных из covid api с использованием axios, но он выдает ошибку
React Hook useEffect has a missing dependency: 'countries'. Either include it or remove the dependency array react-hooks/exhaustive-deps
где находится мое государство
Код:
const [countries,setCountries]=useState([]);
useEffect(()=>{
axios.get('https://disease.sh/v3/covid-19/countries').then(response=>{
//console.log(response.data);
setCountries(response.data);
console.log(countries);
}).catch((error)=>{
console.log(error);
})
},[]);
Я пробовал использовать все решения, предоставленные другими форумами, но это совершенно нормально, о чем упоминают некоторые решения. Почему этот код не работает?
Комментарии:
1. Не входите
countries
в систему после вызоваsetCountries()
. Вот почемуuseEffect()
is требует этого как зависимости.2. Ошибка описывает, что не так. Вы используете
countries
(значение состояния) внутриuseEffect
, не объявляя его как dependency (useEffect(()=>{/*...*/}, [countries]);
) . Итак, как прокомментировал Патрикробертс, удалитеconsole.log
. Это все равно привело бы к устаревшим данным.3. @Yoshi вы не должны объявлять это как зависимость, иначе побочный эффект застрянет в бесконечном цикле.
4. если я это сделаю, журнал появится в бесконечном цикле, но я хочу, чтобы это происходило только при обновлении страницы
5. Также стоит отметить, что значение
countries
не будет обновляться внутри хука, так что вы получите «старое» значениеcountries
, если все равно зарегистрируете его там. Чтобы увидеть там новые данные, вам нужно войтиresponse.data
Ответ №1:
Если вы используете countries
в своем перехватчике, вы должны добавить его в свои dep. В противном случае вы прочитаете устаревшее значение, поскольку значение состояния countries
еще не было обновлено:
useEffect(()=>{
axios.get('https://disease.sh/v3/covid-19/countries').then(response=>{
//console.log(response.data);
setCountries(response.data);
console.log(countries);
}).catch((error)=>{
console.log(error);
})
},[countries]);
Однако в вашем случае я бы посоветовал не добавлять countries
ваши dep, потому что вы также вызываете setCountries
свой хук. Таким образом, ваш перехват будет введен снова, потому countries
что изменился.
Вы должны скорее регистрировать значение стран за пределами вашего перехватчика, если вам это нужно.
console.log(countries);
useEffect(()=>{
axios.get('https://disease.sh/v3/covid-19/countries').then(response=>{
//console.log(response.data);
setCountries(response.data);
}).catch((error)=>{
console.log(error);
})
},[]);
Ответ №2:
Если вы добавляете какие-либо переменные, которые можно изменить в useEffect, вам будет предложено обновить массив зависимостей.Вы регистрируете страны, вот почему вы видите это предупреждение.
Если вы хотите глубже понять useEffect и о массиве зависимостей, блог Дэна Абрамова о полном руководстве по Useeffect будет очень полезен