译零 TransZero · TanStack Query 中文文档
主站

快速开始

更新于 2026-11-02 Solid 查看英文原文 ↗

@tanstack/solid-query 包为在 SolidJS 中使用 TanStack Query 提供了一流的 API。

示例

TypeScript
1import {2  QueryClient,3  QueryClientProvider,4  useQuery,5} from '@tanstack/solid-query'6import { Switch, Match, For } from 'solid-js'7 8const queryClient = new QueryClient()9 10function Example() {11  const query = useQuery(() => ({12    queryKey: ['todos'],13    queryFn: fetchTodos,14  }))15 16  return (17    <div>18      <Switch>19        <Match when={query.isPending}>20          <p>Loading...</p>21        </Match>22        <Match when={query.isError}>23          <p>Error: {query.error.message}</p>24        </Match>25        <Match when={query.isSuccess}>26          <For each={query.data}>{(todo) => <p>{todo.title}</p>}</For>27        </Match>28      </Switch>29    </div>30  )31}32 33function App() {34  return (35    <QueryClientProvider client={queryClient}>36      <Example />37    </QueryClientProvider>38  )39}

Solid Query 与 React Query 的重要差异

Solid Query 提供的 API 与 React Query 类似,但存在一些关键差异,需特别注意。

  • solid-query 原语(例如 useQuery、useMutation、useIsFetching)的参数均为函数,以便在响应式作用域中被追踪。
TypeScript
1// ❌ react version2useQuery({3  queryKey: ['todos', todo],4  queryFn: fetchTodos,5})6 7// ✅ solid version8useQuery(() => ({9  queryKey: ['todos', todo],10  queryFn: fetchTodos,11}))
  • 若你在 <Suspense> 边界内访问查询数据,则 Suspense 可直接用于查询。
TypeScript
1import { For, Suspense } from 'solid-js'2 3function Example() {4  const query = useQuery(() => ({5    queryKey: ['todos'],6    queryFn: fetchTodos,7  }))8  return (9    <div>10      {/* ✅ Will trigger loading fallback, data accessed in a suspense boundary. */}11      <Suspense fallback={'Loading...'}>12        <For each={query.data}>{(todo) => <div>{todo.title}</div>}</For>13      </Suspense>14      {/* ❌ Will not trigger loading fallback, data not accessed in a suspense boundary. */}15      <For each={query.data}>{(todo) => <div>{todo.title}</div>}</For>16    </div>17  )18}
  • Solid Query 原语不支持解构。这些函数的返回值是一个 store,其属性仅在响应式上下文中才会被追踪。
TypeScript
1import {2  QueryClient,3  QueryClientProvider,4  useQuery,5} from '@tanstack/solid-query'6import { Match, Switch } from 'solid-js'7 8const queryClient = new QueryClient()9 10export default function App() {11  return (12    <QueryClientProvider client={queryClient}>13      <Example />14    </QueryClientProvider>15  )16}17 18function Example() {19  // ❌ react version -- supports destructing outside reactive context20  // const { isPending, error, data } = useQuery({21  //   queryKey: ['repoData'],22  //   queryFn: () =>23  //     fetch('https://api.github.com/repos/TanStack/query').then(24  //       (res) => res.json()25  //     ),26  // })27 28  // ✅ solid version -- does not support destructuring outside reactive context29  const query = useQuery(() => ({30    queryKey: ['repoData'],31    queryFn: () =>32      fetch('https://api.github.com/repos/TanStack/query').then((res) =>33        res.json(),34      ),35  }))36 37  // ✅ access query properties in JSX reactive context38  return (39    <Switch>40      <Match when={query.isPending}>Loading...</Match>41      <Match when={query.isError}>Error: {query.error.message}</Match>42      <Match when={query.isSuccess}>43        <div>44          <h1>{query.data.name}</h1>45          <p>{query.data.description}</p>46          <strong>👀 {query.data.subscribers_count}</strong>{' '}47          <strong>✨ {query.data.stargazers_count}</strong>{' '}48          <strong>🍴 {query.data.forks_count}</strong>49        </div>50      </Match>51    </Switch>52  )53}
  • Signal 和 store 值可直接作为函数参数传入。Solid Query 将自动根据 store 更新查询。
TypeScript
1import {2  QueryClient,3  QueryClientProvider,4  useQuery,5} from '@tanstack/solid-query'6import { createSignal, For } from 'solid-js'7 8const queryClient = new QueryClient()9 10function Example() {11  const [enabled, setEnabled] = createSignal(false)12  const [todo, setTodo] = createSignal(0)13 14  // ✅ passing a signal directly is safe and observers update15  // automatically when the value of a signal changes16  const todosQuery = useQuery(() => ({17    queryKey: ['todos'],18    queryFn: fetchTodos,19    enabled: enabled(),20  }))21 22  const todoDetailsQuery = useQuery(() => ({23    queryKey: ['todo', todo()],24    queryFn: fetchTodo,25    enabled: todo() > 0,26  }))27 28  return (29    <div>30      <Switch>31        <Match when={todosQuery.isPending}>32          <p>Loading...</p>33        </Match>34        <Match when={todosQuery.isError}>35          <p>Error: {todosQuery.error.message}</p>36        </Match>37        <Match when={todosQuery.isSuccess}>38          <For each={todosQuery.data}>39            {(todo) => (40              <button onClick={() => setTodo(todo.id)}>{todo.title}</button>41            )}42          </For>43        </Match>44      </Switch>45      <button onClick={() => setEnabled(!enabled())}>Toggle enabled</button>46    </div>47  )48}49 50function App() {51  return (52    <QueryClientProvider client={queryClient}>53      <Example />54    </QueryClientProvider>55  )56}
  • 错误可通过 SolidJS 原生 ErrorBoundary 组件捕获并重置。
    将 throwOnError 设为 true,以确保错误抛出至 ErrorBoundary。

  • 由于属性追踪由 Solid 的细粒度响应式机制处理,因此无需配置 notifyOnChangeProps 等选项。

本页为 TanStack Query 文档(Solid 版)的非官方中文翻译,原文由上游团队维护,遵循 MIT 许可。 译文如有偏差,以英文原文为准。

译自上游 59d11de