Created
December 20, 2022 01:52
-
-
Save tk42/ed245411fd464e73d13801a6c7ac7c33 to your computer and use it in GitHub Desktop.
react-query example
This file contains hidden or 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
/* eslint-disable jsx-a11y/anchor-is-valid */ | |
import React from "react"; | |
import ReactDOM from "react-dom/client"; | |
import axios from "axios"; | |
import { | |
useQuery, | |
useQueryClient, | |
QueryClient, | |
QueryClientProvider, | |
} from "@tanstack/react-query"; | |
import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; | |
const queryClient = new QueryClient(); | |
function App() { | |
const [postId, setPostId] = React.useState(-1); | |
return ( | |
<QueryClientProvider client={queryClient}> | |
<p> | |
As you visit the posts below, you will notice them in a loading state | |
the first time you load them. However, after you return to this list and | |
click on any posts you have already visited again, you will see them | |
load instantly and background refresh right before your eyes!{" "} | |
<strong> | |
(You may need to throttle your network speed to simulate longer | |
loading sequences) | |
</strong> | |
</p> | |
{postId > -1 ? ( | |
<Post postId={postId} setPostId={setPostId} /> | |
) : ( | |
<Posts setPostId={setPostId} /> | |
)} | |
<ReactQueryDevtools initialIsOpen /> | |
</QueryClientProvider> | |
); | |
} | |
function usePosts() { | |
return useQuery({ | |
queryKey: ["posts"], | |
queryFn: async () => { | |
const { data } = await axios.get( | |
"https://jsonplaceholder.typicode.com/posts" | |
); | |
return data; | |
}, | |
}); | |
} | |
function Posts({ setPostId }) { | |
const queryClient = useQueryClient(); | |
const { status, data, error, isFetching } = usePosts(); | |
return ( | |
<div> | |
<h1>Posts</h1> | |
<div> | |
{status === "loading" ? ( | |
"Loading..." | |
) : status === "error" ? ( | |
<span>Error: {error.message}</span> | |
) : ( | |
<> | |
<div> | |
{data.map((post) => ( | |
<p key={post.id}> | |
<a | |
onClick={() => setPostId(post.id)} | |
href="#" | |
style={ | |
// We can access the query data here to show bold links for | |
// ones that are cached | |
queryClient.getQueryData(["post", post.id]) | |
? { | |
fontWeight: "bold", | |
color: "green", | |
} | |
: {} | |
} | |
> | |
{post.title} | |
</a> | |
</p> | |
))} | |
</div> | |
<div>{isFetching ? "Background Updating..." : " "}</div> | |
</> | |
)} | |
</div> | |
</div> | |
); | |
} | |
const getPostById = async (id) => { | |
const { data } = await axios.get( | |
`https://jsonplaceholder.typicode.com/posts/${id}` | |
); | |
return data; | |
}; | |
function usePost(postId) { | |
return useQuery({ | |
queryKey: ["post", postId], | |
queryFn: () => getPostById(postId), | |
enabled: !!postId, | |
}); | |
} | |
function Post({ postId, setPostId }) { | |
const { status, data, error, isFetching } = usePost(postId); | |
return ( | |
<div> | |
<div> | |
<a onClick={() => setPostId(-1)} href="#"> | |
Back | |
</a> | |
</div> | |
{!postId || status === "loading" ? ( | |
"Loading..." | |
) : status === "error" ? ( | |
<span>Error: {error.message}</span> | |
) : ( | |
<> | |
<h1>{data.title}</h1> | |
<div> | |
<p>{data.body}</p> | |
</div> | |
<div>{isFetching ? "Background Updating..." : " "}</div> | |
</> | |
)} | |
</div> | |
); | |
} | |
const rootElement = document.getElementById("root"); | |
ReactDOM.createRoot(rootElement).render(<App />); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment