【发布时间】:2020-06-06 05:14:05
【问题描述】:
我正在尝试挑战自己,将使用钩子的课程项目转换为同一个项目,但不必使用钩子来了解更多关于如何使用类组件做事的信息。目前,我需要帮助弄清楚如何在普通类组件中复制useCallback 挂钩。以下是它在应用中的使用方式。
export const useMovieFetch = 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 endpoint = `${API_URL}movie/${movieId}?api_key=${API_KEY}`;
const result = await(await fetch(endpoint)).json();
const creditsEndpoint = `${API_URL}movie/${movieId}/credits?api_key=${API_KEY}`;
const creditsResult = await (await fetch(creditsEndpoint)).json();
const directors = creditsResult.crew.filter(member => member.job === 'Director');
setState({
...result,
actors: creditsResult.cast,
directors
});
}catch(error){
setError(true);
console.log(error);
}
setLoading(false);
}, [movieId])
useEffect(() => {
if(localStorage[movieId]){
// console.log("grabbing from localStorage");
setState(JSON.parse(localStorage[movieId]));
setLoading(false);
}else{
// console.log("Grabbing from API");
fetchData();
}
}, [fetchData, movieId])
useEffect(() => {
localStorage.setItem(movieId, JSON.stringify(state));
}, [movieId, state])
return [state, loading, error]
}
我了解如何复制其他钩子,例如 useState 和 useEffect,但我正在努力寻找替代 useCallback 的答案。感谢您为这个问题付出的任何努力。
【问题讨论】:
-
我认为你最好的选择是 shouldComponentUpdate:developmentarc.gitbooks.io/react-indepth/content/life_cycle/…
-
我会调查一下,看看我能不能让它工作。如果我得到它的工作,我会告诉你。谢谢
-
仅供参考,功能组件和钩子 API 比类组件 API 更新且通常更推荐,因为它们更擅长实现关注点分离。使用类组件,您只有一个状态对象,以及每个生命周期方法之一,用于实现特定组件的所有逻辑。如果你只是想学习也没关系,但你的课程使用函数式组件和钩子而不是类组件是有原因的。
标签: javascript reactjs react-hooks usecallback