|
1 | 1 | <script setup> |
2 | | -const getPosts = async () => { |
| 2 | +const selectedUser = ref(null) |
| 3 | +
|
| 4 | +const getUsers = async () => { |
3 | 5 | await new Promise(resolve => setTimeout(resolve, 2000)) |
4 | | - return await $fetch('https://jsonplaceholder.typicode.com/posts') |
| 6 | + return await $fetch('https://jsonplaceholder.typicode.com/users') |
| 7 | +} |
| 8 | +
|
| 9 | +const getPosts = async (userId) => { |
| 10 | + const url = 'https://jsonplaceholder.typicode.com/posts' |
| 11 | + return await $fetch(url, { method: 'GET', params: { userId } }) |
5 | 12 | } |
6 | 13 |
|
7 | | -const { isPending, isFetching, isError, data, error } = useQuery({ |
8 | | - queryKey: ['posts'], |
9 | | - queryFn: getPosts, |
10 | | - // staleTime: 1000 * 6, |
| 14 | +const { isPending: isUsersPending, data: users } = useQuery({ |
| 15 | + queryKey: ['users'], |
| 16 | + queryFn: getUsers, |
| 17 | +}) |
| 18 | +
|
| 19 | +const selectedUserId = computed(() => selectedUser.value?.id) |
| 20 | +
|
| 21 | +const { isPending, isFetching, isError, data: posts, error } = useQuery({ |
| 22 | + queryKey: ['posts', selectedUserId], |
| 23 | + queryFn: () => getPosts(selectedUserId.value), |
| 24 | + staleTime: 1000 * 10, |
| 25 | + gcTime: 1000 * 20, |
| 26 | + enabled: !selectedUser.value, |
| 27 | +
|
11 | 28 | }) |
| 29 | +function selectUser(user) { |
| 30 | + selectedUser.value = user |
| 31 | +} |
12 | 32 | </script> |
13 | 33 |
|
14 | 34 | <template> |
| 35 | + <div> |
| 36 | + <h1>Users</h1> |
| 37 | + <div v-if="isUsersPending"> |
| 38 | + Loading... |
| 39 | + </div> |
| 40 | + <div |
| 41 | + v-else |
| 42 | + :style="{ |
| 43 | + display: 'grid', |
| 44 | + gap: '0.5rem', |
| 45 | + paddingLeft: '0.5rem', |
| 46 | + }" |
| 47 | + > |
| 48 | + <div |
| 49 | + v-for="user in users" |
| 50 | + :key="user.id" |
| 51 | + :style="{ |
| 52 | + cursor: 'pointer', |
| 53 | + backgroundColor: selectedUserId === user.id ? 'blue' : 'white', |
| 54 | + color: selectedUserId === user.id ? 'white' : 'black', |
| 55 | + padding: '0.25rem', |
| 56 | + }" |
| 57 | + @click="selectUser(user)" |
| 58 | + > |
| 59 | + {{ user.name }} ({{ user.email }}) |
| 60 | + </div> |
| 61 | + </div> |
| 62 | + </div> |
15 | 63 | <div> |
16 | 64 | <h1>Posts</h1> |
17 | 65 | <div v-if="isPending"> |
18 | 66 | Loading... |
19 | 67 | </div> |
20 | | - |
21 | | - <div v-else-if="isError"> |
22 | | - {{ error.message }} |
23 | | - </div> |
24 | | - |
25 | 68 | <div v-else-if="isFetching"> |
26 | | - Refetching... |
| 69 | + Fetching... |
27 | 70 | </div> |
28 | | - |
| 71 | + <ul v-else-if="isError"> |
| 72 | + <li>Error: {{ error.message }}</li> |
| 73 | + </ul> |
29 | 74 | <ul v-else> |
30 | 75 | <li |
31 | | - v-for="post in data" |
| 76 | + v-for="post in posts" |
32 | 77 | :key="post.id" |
33 | 78 | > |
34 | 79 | {{ post.title }} |
|
0 commit comments