-
-
Notifications
You must be signed in to change notification settings - Fork 461
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
(fix) - fetching on initial render #248
Changes from all commits
1efab44
79ac12d
ac7a89d
4d03ae5
ae149ef
0175321
1c435d3
00b0869
b030115
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -56,12 +56,15 @@ class QueryHandler extends Component<QueryHandlerProps, QueryHandlerState> { | |
this.unsubscribe = teardown; | ||
}; | ||
|
||
state = { | ||
executeQuery: this.executeQuery, | ||
data: undefined, | ||
error: undefined, | ||
fetching: false, | ||
}; | ||
constructor(props) { | ||
super(props); | ||
this.state = { | ||
executeQuery: this.executeQuery, | ||
data: undefined, | ||
error: undefined, | ||
fetching: props.pause !== true, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This approach was suggested but isn't good for SSR as far as I understood |
||
}; | ||
} | ||
|
||
componentDidMount() { | ||
this.executeQuery(); | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -33,19 +33,36 @@ export type UseQueryResponse<T> = [ | |
export const useQuery = <T = any, V = object>( | ||
args: UseQueryArgs<V> | ||
): UseQueryResponse<T> => { | ||
const isMounted = useRef(false); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @JoviDeCroock heads up, this is going to conflict with an existing pr. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Jup, saw that but in theory that invokes a will mount, no? |
||
const unsubscribe = useRef(noop); | ||
const initialState = useRef<UseQueryState<T>>({ | ||
data: undefined, | ||
error: undefined, | ||
fetching: true, | ||
}); | ||
const updateRef = useRef(update => (initialState.current = update)); | ||
|
||
const client = useContext(Context); | ||
|
||
const request = useMemo( | ||
() => createRequest(args.query, args.variables as any), | ||
[args.query, args.variables] | ||
); | ||
|
||
const [state, setState] = useState<UseQueryState<T>>({ | ||
fetching: false, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Can we simplify this PR to only change the initial state? This line being changed from There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I suppose this PR is still in a more "experimental" stage so maybe we can merge yours for now and if that leads to conflicts I can later resolve them 🤔 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Adding this logic to executeQuery would not solve the problem of the initial rendering state though? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Talking about pause this should probably also be accounted in first render trying to get from cache else we’d make that option obsolete for first call. |
||
error: undefined, | ||
data: undefined, | ||
}); | ||
if (!isMounted.current && !args.pause) { | ||
const [teardown] = pipe( | ||
client.executeQuery(request, { | ||
requestPolicy: args.requestPolicy, | ||
}), | ||
subscribe(({ data, error }) => { | ||
updateRef.current({ data, error, fetching: false }); | ||
}) | ||
); | ||
unsubscribe.current = teardown; | ||
} | ||
|
||
const [state, setState] = useState<UseQueryState<T>>(initialState.current); | ||
updateRef.current = setState; | ||
|
||
const executeQuery = useCallback( | ||
(opts?: Partial<OperationContext>) => { | ||
|
@@ -76,9 +93,18 @@ export const useQuery = <T = any, V = object>( | |
); | ||
|
||
useEffect(() => { | ||
executeQuery(); | ||
if (isMounted.current) { | ||
executeQuery(); | ||
} | ||
return unsubscribe.current; | ||
JoviDeCroock marked this conversation as resolved.
Show resolved
Hide resolved
|
||
}, [executeQuery]); | ||
|
||
useEffect(() => { | ||
isMounted.current = true; | ||
return () => { | ||
isMounted.current = false; | ||
}; | ||
}, []); | ||
|
||
return [state, executeQuery]; | ||
}; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I have further implemented the SSR approach but the sync would imply we execute our query here, this isn't possible since this.setState would result in a noop.