如何在react中编写清理功能?

时间:2020-07-25 19:50:49

标签: reactjs react-native

我一直试图了解如何解决useEffect()中的内存泄漏,但是仍然难以理解。

错误代码说,为了解决泄漏,我必须使用清理功能取消所有订阅和异步调用。 这就是我目前的代码。

const [dish,setDish] = useState({title:""})

useEffect(()=>{
    fetchDish()
},[dish.title])

const fetchDish = async() => {

    const apiCall = await fetch('https://exampleurl.json')
    const dishes = await apiCall.json()
    setDish(dishes[props.dishID] )

}

我假设我正在发生内存泄漏,因为一旦卸载,我必须销毁我的餐具对象?

2 个答案:

答案 0 :(得分:1)

您需要在此处使用componentWillUnmount技术,因为这是从useEffect返回的功能组件,将导致相同的行为。

例如:

 useEffect(() => {
        fetchDish()
    
        return () => {
          //unmounting code here..
          //in your case 
          setDish({})
        }
   }, [dish.title])

答案 1 :(得分:0)

首先,我认为您应该阅读Dan Abramov的article,以更好地了解useEffect

如果仅在useEffect中使用该函数,则将其移至useEffect内,以免影响数据流。如果您想重复使用fetchDish,请使用useCallback,以便在不需要时不会被调用。

如果您的案例涉及清除代码,那么里沙夫的答案是正确的

useEffect( () => {
  subscribe();
  return () => unsubscribe();
}

但是我认为反应是想告诉你的是因为你的异步呼叫不断被呼叫

尝试对此进行修改

const [dish,setDish] = useState({title:""})

useEffect(()=>{
    async function fetchDish(){

        const apiCall = await fetch('https://exampleurl.json')
        const dishes = await apiCall.json()
        setDish(dishes[props.dishID] )

    }
    fetchDish()
},[])