-
-
Notifications
You must be signed in to change notification settings - Fork 25
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(react-query): add
queryOptions
(#828)
fix #767 with @wes5510 @wes5510 I guess that this issue is simmilar issue with TanStack/query#6556 I want to solve this issue like TanStack/query#6556 (comment) (Is this solution same with your opinion?). In my opinion, I think it would be a good idea to add queryOptions ![Apr-03-2024 01-54-47](https://github.com/suspensive/react/assets/61593290/e767b5ad-df9b-4f05-8678-a5b7f47bd6e4) ### select type when I hover on field name ![image](https://github.com/suspensive/react/assets/61593290/8091735f-40c6-43cd-8035-8682b5c4fb96) ### select type when I hover on select's arg I expected TData but it's any!!??🥲 ![image](https://github.com/suspensive/react/assets/61593290/a8be5353-0f18-4876-bdd9-e791e1d14d70) I mention you because you suggested this interface(queryOptions) and I've wanted to add it for a while too. I would like to request a review to you with our maintainers. # Solution: new `queryOptions` This new queryOptions will solve select's type issue like TanStack/query#6556 (comment) ## More advantages Tkdodo, The maintainer of TanStack Query explains well why this interface is needed in [video explaining queryOptions in TanStack Query v5](https://youtu.be/bhE3wuB_TuA?feature=shared&t=1697). You can also use queryOptions in TanStack Query v4. 1. QueryKey management becomes easier by processing queryKey and queryFn together. 2. You can remove unnecessary custom query hooks. This is because they can all be used directly in `useQuery`, `useQueries` of TanStack Query v4, and `useSuspenseQuery`, `useSuspenseQueries`, and `SuspenseQuery` of Suspensive React Query. 3. TanStack Query v5 already supports queryOptions. This Suspensive React Query's `queryOptions` will make migration from TanStack Query v4 to TanStack Query v5 easier. ```jsx /queryOptions/ import { queryOptions, useSuspenseQuery, useSuspenseQueries, SuspenseQuery } from '@suspensive/react-query' import { useQuery, useQueries, useQueryClient } from '@tanstack/react-query' const postQueryOptions = (postId) => queryOptions({ queryKey: ['posts', postId] as const, queryFn: ({ queryKey: [, postId], // You can use queryKey. }) => fetch(`https://example.com/posts/${postId}`), }) // No need to create custom query hooks. // You can use queryOptions directly in useQuery, useQueries, useSuspenseQuery, useSuspenseQueries, SuspenseQuery. const post1Query = useQuery(postQueryOptions(1)) const { data: post1 } = useSuspenseQuery({ ...postQueryOptions(1); refetchInterval: 2000, // Extensibility is clearly expressed in usage. }) const [post1Query, post2Query] = useQueries({ queries: [postQueryOptions(1), { ...postQueryOptions(2), refetchInterval: 2000 }], }) const [{ data: post1 }, { data: post2 }] = useSuspenseQueries({ queries: [postQueryOptions(1), { ...postQueryOptions(2), refetchInterval: 2000 }], }) const Example = () => <SuspenseQuery {...postQueryOptions(1)}>{({ data: post1 }) => <>{post1.text}</>}</SuspenseQuery> // You can easily use queryKey and queryFn in queryClient's methods. const queryClient = useQueryClient() queryClient.refetchQueries(postQueryOptions(1)) queryClient.prefetchQuery(postQueryOptions(1)) queryClient.invalidateQueries(postQueryOptions(1)) queryClient.fetchQuery(postQueryOptions(1)) queryClient.resetQueries(postQueryOptions(1)) queryClient.cancelQueries(postQueryOptions(1)) ``` ## PR Checklist - [x] I did below actions if need 1. I read the [Contributing Guide](https://github.com/suspensive/react/blob/main/CONTRIBUTING.md) 2. I added documents and tests. --------- Co-authored-by: Gihyeon Lee <wes5510@icloud.com> Co-authored-by: Minsoo Kim <57122180+minsoo-web@users.noreply.github.com>
- Loading branch information
1 parent
5ba8832
commit 7f19c76
Showing
18 changed files
with
532 additions
and
83 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
"@suspensive/react-query": minor | ||
--- | ||
|
||
feat(react-query): add queryOptions |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
46 changes: 46 additions & 0 deletions
46
docs/suspensive.org/src/pages/docs/react-query/queryOptions.en.mdx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
# queryOptions | ||
|
||
Tkdodo, The maintainer of TanStack Query explains well why this interface is needed in [video explaining queryOptions in TanStack Query v5](https://youtu.be/bhE3wuB_TuA?feature=shared&t=1697). | ||
You can also use queryOptions in TanStack Query v4. | ||
|
||
1. QueryKey management becomes easier by processing queryKey and queryFn together. | ||
2. You can remove unnecessary custom query hooks. This is because they can all be used directly in `useQuery`, `useQueries` of TanStack Query v4, and `useSuspenseQuery`, `useSuspenseQueries`, and `SuspenseQuery` of Suspensive React Query. | ||
3. TanStack Query v5 already supports queryOptions. This Suspensive React Query's `queryOptions` will make migration from TanStack Query v4 to TanStack Query v5 easier. | ||
|
||
```jsx /queryOptions/ | ||
import { queryOptions, useSuspenseQuery, useSuspenseQueries, SuspenseQuery } from '@suspensive/react-query' | ||
import { useQuery, useQueries, useQueryClient } from '@tanstack/react-query' | ||
|
||
const postQueryOptions = (postId) => | ||
queryOptions({ | ||
queryKey: ['posts', postId] as const, | ||
queryFn: ({ | ||
queryKey: [, postId], // You can use queryKey. | ||
}) => fetch(`https://example.com/posts/${postId}`), | ||
}) | ||
|
||
// No need to create custom query hooks. | ||
// You can use queryOptions directly in useQuery, useQueries, useSuspenseQuery, useSuspenseQueries, SuspenseQuery. | ||
const post1Query = useQuery(postQueryOptions(1)) | ||
const { data: post1 } = useSuspenseQuery({ | ||
...postQueryOptions(1); | ||
refetchInterval: 2000, // Extensibility is clearly expressed in usage. | ||
}) | ||
const [post1Query, post2Query] = useQueries({ | ||
queries: [postQueryOptions(1), { ...postQueryOptions(2), refetchInterval: 2000 }], | ||
}) | ||
const [{ data: post1 }, { data: post2 }] = useSuspenseQueries({ | ||
queries: [postQueryOptions(1), { ...postQueryOptions(2), refetchInterval: 2000 }], | ||
}) | ||
const Example = () => <SuspenseQuery {...postQueryOptions(1)}>{({ data: post1 }) => <>{post1.text}</>}</SuspenseQuery> | ||
|
||
// You can easily use queryKey and queryFn in queryClient's methods. | ||
const queryClient = useQueryClient() | ||
queryClient.refetchQueries(postQueryOptions(1)) | ||
queryClient.prefetchQuery(postQueryOptions(1)) | ||
queryClient.invalidateQueries(postQueryOptions(1)) | ||
queryClient.fetchQuery(postQueryOptions(1)) | ||
queryClient.resetQueries(postQueryOptions(1)) | ||
queryClient.cancelQueries(postQueryOptions(1)) | ||
|
||
``` |
46 changes: 46 additions & 0 deletions
46
docs/suspensive.org/src/pages/docs/react-query/queryOptions.ko.mdx
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
# queryOptions | ||
|
||
TanStack Query의 메인테이너 [Tkdodo의 TanStack Query v5의 queryOptions 설명 영상](https://youtu.be/bhE3wuB_TuA?feature=shared&t=1697)에서 이 interface가 필요한 이유를 잘 설명되어 있습니다. | ||
TanStack Query v4에서도 queryOptions를 활용할 수 있습니다. | ||
|
||
1. queryKey와 queryFn을 묶어서 처리해 queryKey관리가 쉬워집니다. | ||
2. 불필요한 커스텀 쿼리 훅을 제거할 수 있습니다. TanStack Query v4의 `useQuery`, `useQueries`, Suspensive React Query의 `useSuspenseQuery`, `useSuspenseQueries`, `SuspenseQuery`에 모두 직접 사용할 수 있기 때문입니다. | ||
3. TanStack Query v5에는 이미 queryOptions가 제공되고 있기 때문에 TanStack Query v4에서 TanStack Query v5로의 마이그레이션이 쉬워집니다. | ||
|
||
```jsx /queryOptions/ | ||
import { queryOptions, useSuspenseQuery, useSuspenseQueries, SuspenseQuery } from '@suspensive/react-query' | ||
import { useQuery, useQueries, useQueryClient } from '@tanstack/react-query' | ||
|
||
const postQueryOptions = (postId) => | ||
queryOptions({ | ||
queryKey: ['posts', postId] as const, | ||
queryFn: ({ | ||
queryKey: [, postId], // queryKey를 활용할 수 있습니다. | ||
}) => fetch(`https://example.com/posts/${postId}`), | ||
}) | ||
|
||
// 커스텀 쿼리 훅을 만들 필요가 없습니다. | ||
// useQuery, useQueries, useSuspenseQuery, useSuspenseQueries, SuspenseQuery에서 직접 queryOptions를 활용할 수 있습니다. | ||
const post1Query = useQuery(postQueryOptions(1)) | ||
const { data: post1 } = useSuspenseQuery({ | ||
...postQueryOptions(1), | ||
refetchInterval: 2000, // 사용처에서 확장성을 명확히 표현됩니다. | ||
}) | ||
const [post1Query, post2Query] = useQueries({ | ||
queries: [postQueryOptions(1), { ...postQueryOptions(2), refetchInterval: 2000 }], | ||
}) | ||
const [{ data: post1 }, { data: post2 }] = useSuspenseQueries({ | ||
queries: [postQueryOptions(1), { ...postQueryOptions(2), refetchInterval: 2000 }], | ||
}) | ||
const Example = () => <SuspenseQuery {...postQueryOptions(1)}>{({ data: post1 }) => <>{post1.text}</>}</SuspenseQuery> | ||
|
||
// queryClient의 메소드에서 queryKey와 queryFn을 쉽게 활용할 수 있습니다. | ||
const queryClient = useQueryClient() | ||
queryClient.refetchQueries(postQueryOptions(1)) | ||
queryClient.prefetchQuery(postQueryOptions(1)) | ||
queryClient.invalidateQueries(postQueryOptions(1)) | ||
queryClient.fetchQuery(postQueryOptions(1)) | ||
queryClient.resetQueries(postQueryOptions(1)) | ||
queryClient.cancelQueries(postQueryOptions(1)) | ||
|
||
``` |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.