Suspense
一起使用createQuery
参数Accessor<QueryOptions>
queryKey: unknown[]
queryFn: (context: QueryFunctionContext) => Promise<TData>
enabled: boolean
select: (data: TData) => unknown
placeholderData: TData | (previousValue: TData | undefined; previousQuery: Query | undefined,) => TData
deferStream: boolean
reconcile: false | string | ((oldData: TData | undefined, newData: TData) => TData)
gcTime: number | Infinity
networkMode: 'online' | 'always' | 'offlineFirst
initialData: TData | () => TData
initialDataUpdatedAt: number | (() => number | undefined)
meta: Record<string, unknown>
queryKeyHashFn: (queryKey: QueryKey) => string
refetchInterval: number | false | ((query: Query) => number | false | undefined)
refetchIntervalInBackground: boolean
refetchOnMount: boolean | "always" | ((query: Query) => boolean | "always")
refetchOnWindowFocus: boolean | "always" | ((query: Query) => boolean | "always")
refetchOnReconnect: boolean | "always" | ((query: Query) => boolean | "always")
retry: boolean | number | (failureCount: number, error: TError) => boolean
retryOnMount: boolean
retryDelay: number | (retryAttempt: number, error: TError) => number
staleTime: number | Infinity
throwOnError: undefined | boolean | (error: TError, query: Query) => boolean
Accessor<QueryClient>
createQuery
返回值 - Store<QueryResult<TData, TError>>
status: QueryStatus
isPending: boolean
isSuccess: boolean
isError: boolean
isLoadingError: boolean
isRefetchError: boolean
data: Resource<TData>
dataUpdatedAt: number
error: null | TError
errorUpdatedAt: number
isStale: boolean
isPlaceholderData: boolean
isFetched: boolean
isFetchedAfterMount: boolean
fetchStatus: FetchStatus
isFetching: boolean
isPaused: boolean
isRefetching: boolean
isLoading: boolean
isInitialLoading: boolean
failureCount: number
failureReason: null | TError
errorUpdateCount: number
refetch: (options: { throwOnError: boolean, cancelRefetch: boolean }) => Promise<UseQueryResult>
const {
data,
dataUpdatedAt,
error,
errorUpdatedAt,
failureCount,
failureReason,
fetchStatus,
isError,
isFetched,
isFetchedAfterMount,
isFetching,
isInitialLoading,
isLoading,
isLoadingError,
isPaused,
isPending,
isPlaceholderData,
isRefetchError,
isRefetching,
isStale,
isSuccess,
refetch,
status,
} = createQuery(
() => ({
queryKey,
queryFn,
enabled,
select,
placeholderData,
deferStream,
reconcile,
gcTime,
networkMode,
initialData,
initialDataUpdatedAt,
meta,
queryKeyHashFn,
refetchInterval,
refetchIntervalInBackground,
refetchOnMount,
refetchOnReconnect,
refetchOnWindowFocus,
retry,
retryOnMount,
retryDelay,
staleTime,
throwOnError,
}),
() => queryClient,
)
const {
data,
dataUpdatedAt,
error,
errorUpdatedAt,
failureCount,
failureReason,
fetchStatus,
isError,
isFetched,
isFetchedAfterMount,
isFetching,
isInitialLoading,
isLoading,
isLoadingError,
isPaused,
isPending,
isPlaceholderData,
isRefetchError,
isRefetching,
isStale,
isSuccess,
refetch,
status,
} = createQuery(
() => ({
queryKey,
queryFn,
enabled,
select,
placeholderData,
deferStream,
reconcile,
gcTime,
networkMode,
initialData,
initialDataUpdatedAt,
meta,
queryKeyHashFn,
refetchInterval,
refetchIntervalInBackground,
refetchOnMount,
refetchOnReconnect,
refetchOnWindowFocus,
retry,
retryOnMount,
retryDelay,
staleTime,
throwOnError,
}),
() => queryClient,
)
以下是如何在 Solid Query 中使用 createQuery 原始方法的一些示例。
createQuery 最基本的用法是创建一个从 API 获取数据的 query。
import { createQuery } from '@tanstack/solid-query'
function App() {
const todos = createQuery(() => ({
queryKey: 'todos',
queryFn: async () => {
const response = await fetch('/api/todos')
if (!response.ok) {
throw new Error('Failed to fetch todos')
}
return response.json()
},
}))
return (
<div>
<Show when={todos.isError}>
<div>Error: {todos.error.message}</div>
</Show>
<Show when={todos.isLoading}>
<div>Loading...</div>
</Show>
<Show when={todos.isSuccess}>
<div>
<div>Todos:</div>
<ul>
<For each={todos.data}>{(todo) => <li>{todo.title}</li>}</For>
</ul>
</div>
</Show>
</div>
)
}
import { createQuery } from '@tanstack/solid-query'
function App() {
const todos = createQuery(() => ({
queryKey: 'todos',
queryFn: async () => {
const response = await fetch('/api/todos')
if (!response.ok) {
throw new Error('Failed to fetch todos')
}
return response.json()
},
}))
return (
<div>
<Show when={todos.isError}>
<div>Error: {todos.error.message}</div>
</Show>
<Show when={todos.isLoading}>
<div>Loading...</div>
</Show>
<Show when={todos.isSuccess}>
<div>
<div>Todos:</div>
<ul>
<For each={todos.data}>{(todo) => <li>{todo.title}</li>}</For>
</ul>
</div>
</Show>
</div>
)
}
createQuery 接受返回对象的函数的原因是为了允许响应式选项。当 query 选项依赖于可能随时间变化的其他值/信号时,这非常有用。Solid Query 可以在响应式作用域中跟踪传递的函数,并在依赖项更改时重新运行它。
import { createQuery } from '@tanstack/solid-query'
function App() {
const [filter, setFilter] = createSignal('all')
const todos = createQuery(() => ({
queryKey: ['todos', filter()],
queryFn: async () => {
const response = await fetch(`/api/todos?filter=${filter()}`)
if (!response.ok) {
throw new Error('Failed to fetch todos')
}
return response.json()
},
}))
return (
<div>
<div>
<button onClick={() => setFilter('all')}>All</button>
<button onClick={() => setFilter('active')}>Active</button>
<button onClick={() => setFilter('completed')}>Completed</button>
</div>
<Show when={todos.isError}>
<div>Error: {todos.error.message}</div>
</Show>
<Show when={todos.isLoading}>
<div>Loading...</div>
</Show>
<Show when={todos.isSuccess}>
<div>
<div>Todos:</div>
<ul>
<For each={todos.data}>{(todo) => <li>{todo.title}</li>}</For>
</ul>
</div>
</Show>
</div>
)
}
import { createQuery } from '@tanstack/solid-query'
function App() {
const [filter, setFilter] = createSignal('all')
const todos = createQuery(() => ({
queryKey: ['todos', filter()],
queryFn: async () => {
const response = await fetch(`/api/todos?filter=${filter()}`)
if (!response.ok) {
throw new Error('Failed to fetch todos')
}
return response.json()
},
}))
return (
<div>
<div>
<button onClick={() => setFilter('all')}>All</button>
<button onClick={() => setFilter('active')}>Active</button>
<button onClick={() => setFilter('completed')}>Completed</button>
</div>
<Show when={todos.isError}>
<div>Error: {todos.error.message}</div>
</Show>
<Show when={todos.isLoading}>
<div>Loading...</div>
</Show>
<Show when={todos.isSuccess}>
<div>
<div>Todos:</div>
<ul>
<For each={todos.data}>{(todo) => <li>{todo.title}</li>}</For>
</ul>
</div>
</Show>
</div>
)
}
当 query 处于 pending 或 error 状态时,createQuery 支持触发 SolidJS Suspense 和 ErrorBoundary 组件。这允许您轻松处理组件中的加载和错误状态。
import { createQuery } from '@tanstack/solid-query'
function App() {
const todos = createQuery(() => ({
queryKey: 'todos',
queryFn: async () => {
const response = await fetch('/api/todos')
if (!response.ok) {
throw new Error('Failed to fetch todos')
}
return response.json()
},
throwOnError: true,
}))
return (
<ErrorBoundary fallback={<div>Error: {todos.error.message}</div>}>
<Suspense fallback={<div>Loading...</div>}>
<div>
<div>Todos:</div>
<ul>
<For each={todos.data}>{(todo) => <li>{todo.title}</li>}</For>
</ul>
</div>
</Suspense>
</ErrorBoundary>
)
}
import { createQuery } from '@tanstack/solid-query'
function App() {
const todos = createQuery(() => ({
queryKey: 'todos',
queryFn: async () => {
const response = await fetch('/api/todos')
if (!response.ok) {
throw new Error('Failed to fetch todos')
}
return response.json()
},
throwOnError: true,
}))
return (
<ErrorBoundary fallback={<div>Error: {todos.error.message}</div>}>
<Suspense fallback={<div>Loading...</div>}>
<div>
<div>Todos:</div>
<ul>
<For each={todos.data}>{(todo) => <li>{todo.title}</li>}</For>
</ul>
</div>
</Suspense>
</ErrorBoundary>
)
}
createQuery 返回一个具有以下属性的 SolidJS store