#reactjs #react-hooks
#reactjs #реагирующие хуки
Вопрос:
Я работаю с tmdb api, я использовал react useEffect и useContext для второстепенных вещей, и это работает. Я решил использовать api, и он переходит в этот бесконечный цикл каждый раз, когда я пытаюсь его запустить. Я использую axios с useEffects и useContext. Ниже приведен компонент, вызывающий axios
введите описание изображения здесь
function MovieList(props) {
useEffect(() => {
const getMovies = async () => { };
try {
const response = await axios.get(movieUrl, { cancelToken: source.token });
addMovies(response.data.results);
// setLoading(false)
} catch (error) {
if (axios.isCancel(error)) {
console.log('Request canceled', error.message);
} else {
// handle error
throw error
}
}
getMovies();
}, []);
return (
<React.Fragment>
<div className="container-fluid pl-5">
<h2 className="white mt-4">{pageTitle}</h2>
<div className="row">
{movies.map((movie) => {
return <Movie key={movie.id} movie={movie} />;
})}
</div>
</div>
</React.Fragment>
);
}
Мой код переходит в бесконечный цикл, и это сводит меня с ума.
И мой контекстный код приведен ниже:
export const MovieProvider = (props) => {
const [isFav, setIsFav] = useState(false)
const [movies, setMovies] = useState([]);
const [filtered, setFilteredMovies] = useState([])
const addMovies = (res) => {
setMovies([...res]);
}
const addFavMovies = (res) => {
if(res){
setMovies([...res]);
}
}
const addFilteredMovies = (res) => {
setFilteredMovies([...filtered, res]);
}
return (
<MovieContext.Provider value={{
fav: [isFav, setIsFav],
movies, addMovies, addFavMovies,
filtered, addFilteredMovies,
}}>
{props.children}
</MovieContext.Provider>
)
}
Комментарии:
1. ваш
useEffect
запускается один раз в жизни для компонента. Поэтому он не может зацикливаться бесконечно. Я уверен, что ваш компонент воссоздается с нуля снова и снова. Причина где-то выше — в одном из его родительских элементов. По предоставленному вами коду трудно сказать точно.2. откуда
movieUrl
иaddMovies
откуда? вы пропустили добавлениеconst {} = useContext(MovieContext)
или просто забыли добавить в фрагмент? короче говоря, вам нужно добавить эти deps в массивuseEffect
deps.3. addMovies из контекста, и там, где я устанавливаю состояние, оно находится в коде контекста выше. movieUrl — это просто строка API, из которого я извлекаю фильмы