Javascript 将useEffect挂钩与“一起使用”;异步;
如何清理react钩子中的react请求。我读到需要进入我的钩子中止控制器,但我不知道如何。我正在使用next.js。消除此问题的最佳方法是什么?我得到这个警告: 警告:无法对已卸载的组件执行React状态更新。这是一个no-op,但它表示应用程序中存在内存泄漏。要修复此问题,请取消useEffect清理函数中的所有订阅和异步任务 这是我获取数据的自定义挂钩:Javascript 将useEffect挂钩与“一起使用”;异步;,javascript,reactjs,fetch,react-hooks,next.js,Javascript,Reactjs,Fetch,React Hooks,Next.js,如何清理react钩子中的react请求。我读到需要进入我的钩子中止控制器,但我不知道如何。我正在使用next.js。消除此问题的最佳方法是什么?我得到这个警告: 警告:无法对已卸载的组件执行React状态更新。这是一个no-op,但它表示应用程序中存在内存泄漏。要修复此问题,请取消useEffect清理函数中的所有订阅和异步任务 这是我获取数据的自定义挂钩: import { useState, useEffect, useCallback } from 'react' import { MO
import { useState, useEffect, useCallback } from 'react'
import { MOVIE_API_URL, MOVIE_KEY } from '../../config'
export const useMovieDetailsFetch = (movieId) => {
const [state, setState] = useState({})
const [loading, setLoading] = useState(true)
const [error, setError] = useState(false)
const fetchData = useCallback(async () => {
setError(false)
setLoading(true)
try {
const movieDetailsEndpoint = `${MOVIE_API_URL}movie/${movieId}?api_key=${MOVIE_KEY}`
const result = await (await fetch(movieDetailsEndpoint)).json()
const creditsEndpoint = `${MOVIE_API_URL}movie/${movieId}/credits?api_key=${MOVIE_KEY}`
const creditsResult = await (await fetch(creditsEndpoint)).json()
// Filtring in crew for directors only
const movieDirectors = creditsResult.crew.filter(
(member) => member.job === 'Director'
)
setState({
...result,
movieDirectors,
actors: creditsResult.cast,
})
} catch (error) {
setError(true)
}
setLoading(false)
}, [movieId])
useEffect(() => {
fetchData()
}, [fetchData])
return [state, loading, error]
}
使用最原始的形式:
const controller = new AbortController();
const { signal } = controller;
...
fetch(url, { signal });
...
// abort
controller.abort();
中止飞行中的提取有效挂钩
useEffect(() => {
const controller = new AbortController();
const { signal } = controller;
fetch(url, { signal });
return () => {
controller.abort(); // abort on unmount for cleanup
};
}, []);
当我需要开发一种取消获取请求的方法时,我发现这非常有用
编辑
需要将信号
添加到获取
请求选项对象中。您还可以在effect中定义async fetchData
函数(这是正常的),因此它都包含在effect钩子的回调范围内
export const useMovieDetailsFetch = (movieId) => {
const [state, setState] = useState({})
const [loading, setLoading] = useState(true)
const [error, setError] = useState(false)
useEffect(() => {
const controller = new AbortController();
const { signal } = controller;
const fetchData = async () => {
setError(false);
setLoading(true);
try {
const movieDetailsEndpoint = `${MOVIE_API_URL}movie/${movieId}?api_key=${MOVIE_KEY}`;
const result = await (
await fetch(movieDetailsEndpoint, { signal })
).json();
const creditsEndpoint = `${MOVIE_API_URL}movie/${movieId}/credits?api_key=${MOVIE_KEY}`;
const creditsResult = await (
await fetch(creditsEndpoint, { signal })
).json();
// Filtring in crew for directors only
const movieDirectors = creditsResult.crew.filter(
(member) => member.job === 'Director'
);
setState({
...result,
movieDirectors,
actors: creditsResult.cast,
});
} catch (error) {
setError(true);
}
setLoading(false);
}
fetchData();
return () => controller.abort();
}, [movieId]);
return [state, loading, error];
}
使用最原始的形式:
const controller = new AbortController();
const { signal } = controller;
...
fetch(url, { signal });
...
// abort
controller.abort();
中止飞行中的提取有效挂钩
useEffect(() => {
const controller = new AbortController();
const { signal } = controller;
fetch(url, { signal });
return () => {
controller.abort(); // abort on unmount for cleanup
};
}, []);
当我需要开发一种取消获取请求的方法时,我发现这非常有用
编辑
需要将信号
添加到获取
请求选项对象中。您还可以在effect中定义async fetchData
函数(这是正常的),因此它都包含在effect钩子的回调范围内
export const useMovieDetailsFetch = (movieId) => {
const [state, setState] = useState({})
const [loading, setLoading] = useState(true)
const [error, setError] = useState(false)
useEffect(() => {
const controller = new AbortController();
const { signal } = controller;
const fetchData = async () => {
setError(false);
setLoading(true);
try {
const movieDetailsEndpoint = `${MOVIE_API_URL}movie/${movieId}?api_key=${MOVIE_KEY}`;
const result = await (
await fetch(movieDetailsEndpoint, { signal })
).json();
const creditsEndpoint = `${MOVIE_API_URL}movie/${movieId}/credits?api_key=${MOVIE_KEY}`;
const creditsResult = await (
await fetch(creditsEndpoint, { signal })
).json();
// Filtring in crew for directors only
const movieDirectors = creditsResult.crew.filter(
(member) => member.job === 'Director'
);
setState({
...result,
movieDirectors,
actors: creditsResult.cast,
});
} catch (error) {
setError(true);
}
setLoading(false);
}
fetchData();
return () => controller.abort();
}, [movieId]);
return [state, loading, error];
}
我将它输入到这个钩子,但它仍然不起作用`useffect(()=>{const controller=new AbortController()const{signal}=controller fetchData({signal})return()=>{controller.abort()},[fetchData])`@Kubaklusniak需要将信号传递给
fetch
函数的options参数。使用建议的解决方案更新了我的答案。我将此输入到此挂钩,但它仍然不起作用`useffect(()=>{const controller=new AbortController()const{signal}=controller fetchData({signal})return()=>{controller.abort()},[fetchData])`@Kubaklusniak需要将信号传递给fetch
函数的options参数。用建议的解决方案更新了我的答案。