-
Imagine that you have two useQuery(useQuery A which is in Component A and B which is in Component B) on Page A. const PageA = () => {
const [selectedId, setSelectedId] = useState<undefined | number>(undefined)
return (
<ComponentA setSelectedId={setSelectedId} />
<ComponentB selectedDataId={selectedId} />
)
}
//...
const ComponentA = ({setSelectedId}: any) => {
const { isLoading, data: A } = useQuery(["useQueryB"], api)
// lists all data
<Table data={A} selectOne={(id: number) => (e)=>setSelectedId(id) }/>
//...
const ComponentB = ({ selectedDataId }: {selectedDataId: number | undefined } ) => {
// ERROR: selectedDataId is undefined
const { isLoading, data: B } = useQuery(["useQueryB", selectedDataId], api)
// lists selected data
<Table data={B} />
//... useQuery A fetches data(A) from server when onMount and lists it on table. When you get to Page A then useQuery A fetches data, but also useQuery B does, but you did't click anything of A so
It's quite simple, but what if we want to handle undefined value inside of ComponentB? I takes some time and finally figure it out, but ugly way: const ComponentB = ({ selectedDataId }: { selectedDataId: number | undefined ) => {
const { isLoading, data: B } = useQuery(["useQueryB", selectedDataId], api)
// lists all data
<Table data={B} />
export const api= (
key: string,
id: number | undefined,
) => {
if (!id) {
return Promise.reject()
}
return api
.get(`/getSomething`, {
id,
}) It looks ugly for me. Because of
Any ideas? 🤗 |
Beta Was this translation helpful? Give feedback.
Replies: 1 comment 1 reply
-
I found a way! the solution was import { useInfiniteQuery, useMutation } from 'react-query'
import { PagingResponse, ErrorResponse } from '../apis/util'
import {
AnalysisListPatientQuery,
getAnalysisListByPatientIdApi,
AnalysisListPatientResponse,
cancleAnalysisApi,
retryAnalysisApi,
deleteAnalysisApi,
} from '../apis/analysis'
export default (selectedPatientId?: number) =>
useInfiniteQuery<
PagingResponse<AnalysisListPatientResponse>,
[string, Query],
number | boolean | undefined,
ErrorResponse
>(['/analysis/list/patient', { patientId: selectedPatientId }], getApi, {
enabled: !(selectedPatientId === undefined), // When false is passed to enabled, it will not call query on first render
...
}) export const getApi= (
key: string,
query: Query,
page?: number | boolean,
) => {
return api
.post<PagingResponse<AnalysisListPatientResponse>>(`/analysis/list/`, {
page: query.page ? query.page : page || 1,
size: query.size || 9,
patientId: query.patientId,
})
.then(({ data }) => data || [])
} Hope this helps someone... |
Beta Was this translation helpful? Give feedback.
I found a way! the solution was
enabled