1- import { useCallback , useEffect , useRef , useState } from 'react'
1+ import {
2+ useCallback ,
3+ useEffect ,
4+ useLayoutEffect ,
5+ useRef ,
6+ useState ,
7+ } from 'react'
28import { useDataLoaderContext } from './DataLoaderProvider'
39import { StatusEnum } from './constants'
410import DataLoader from './dataloader'
@@ -21,11 +27,20 @@ function useDataLoader<ResultType, ErrorType = Error>(
2127 const methodRef = useRef ( method )
2228 const onSuccessRef = useRef ( onSuccess )
2329 const onErrorRef = useRef ( onError ?? onGlobalError )
30+ const isMountedRef = useRef ( false )
2431 const [ , setCounter ] = useState ( 0 )
2532 const forceRerender = useCallback ( ( ) => {
2633 setCounter ( current => current + 1 )
2734 } , [ ] )
2835
36+ useLayoutEffect ( ( ) => {
37+ isMountedRef . current = true
38+
39+ return ( ) => {
40+ isMountedRef . current = false
41+ }
42+ } )
43+
2944 const request = getOrAddRequest ( fetchKey , {
3045 enabled,
3146 method : methodRef . current ,
@@ -75,10 +90,13 @@ function useDataLoader<ResultType, ErrorType = Error>(
7590 } , [ onError , onGlobalError ] )
7691
7792 useEffect ( ( ) => {
78- if ( enabled && request . loadCount === 0 ) {
79- if ( keepPreviousData ) {
80- previousDataRef . current = request . data
81- }
93+ if ( keepPreviousData ) {
94+ previousDataRef . current = request . data
95+ }
96+ } , [ request . data , keepPreviousData ] )
97+
98+ useEffect ( ( ) => {
99+ if ( enabled && ! request . isCalled ) {
82100 request . load ( ) . then ( onSuccessRef . current ) . catch ( onErrorRef . current )
83101 }
84102 } , [ enabled , request , keepPreviousData ] )
@@ -87,6 +105,8 @@ function useDataLoader<ResultType, ErrorType = Error>(
87105 let timeout : NodeJS . Timeout
88106
89107 if (
108+ isMountedRef . current &&
109+ request &&
90110 pollingInterval &&
91111 needPolling &&
92112 ( request . status === StatusEnum . SUCCESS ||
@@ -106,7 +126,7 @@ function useDataLoader<ResultType, ErrorType = Error>(
106126 }
107127
108128 return ( ) => {
109- if ( timeout ) clearTimeout ( timeout )
129+ if ( timeout && ! isMountedRef . current ) clearTimeout ( timeout )
110130 }
111131 } , [ pollingInterval , needPolling , request , request . status , request . data ] )
112132
0 commit comments