You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TanStack Solid-Query查询参数更新失效问题求助

问题解决:Solid-Query 请求参数始终为 undefined 的修复

问题原因

你的代码里,createQuery 的第二个参数直接传了静态对象 { query: { name: name() } },这里的 name() 只会在组件首次渲染时执行一次。哪怕后续输入框更新了 name 信号,这个配置对象不会重新生成,导致请求携带的始终是初始的 undefined。而查询键用了响应式函数,所以能触发重新请求,但参数没跟上。

修复方案

把查询参数的配置改成函数形式,让它每次触发查询时都能获取最新的 name 信号值:

import { For, Match, Switch, createSignal } from "solid-js";
import { MedServiceItem } from "./MedServiceItem";
import { useLocale } from "@/features/locale/locale.context";
import { BiRegularSearchAlt } from "solid-icons/bi";
import { apiClient } from "@/api/api-client";

export const MedServiceList = () => {
  const locale = useLocale();

  const [name, setName] = createSignal<string>();

  const servicesQuery = apiClient.medServices.getAll.createQuery(
    () => ["services", name()],
    // 将查询参数配置改为函数,确保每次请求都获取最新的name值
    () => ({ query: { name: name() } })
  );

  return (
    <div class="flex flex-col gap-6">
      <div>
        <div
          class="flex items-center  border-[0.5px] border-gray-600 rounded-sm 
          h-[2.5rem] w-[16rem] p-2 gap-2"
        >
          <BiRegularSearchAlt class="text-white scale-150" />
          <input
            type="text"
            class="bg-transparent flex-1 text-white shadow-lg"
            placeholder={locale.t("filterServiceName")}
            onInput={(e) => {
              setName(e.target.value);
            }}
          />
        </div>
      </div>
      <Switch>
        <Match when={servicesQuery.isLoading}>
          <div class="flex justify-center items-center h-full">
            <p class="text-white">加载中...</p>
          </div>
        </Match>
        <Match when={servicesQuery.isError && servicesQuery.error}>
          <p class="text-white">错误: {servicesQuery.error?.body as string}</p>
        </Match>
        <Match when={servicesQuery.isSuccess}>
          <div class="flex flex-col gap-4">
            <For each={servicesQuery.data?.body}>
              {(ser) => <MedServiceItem medService={ser} />}
            </For>
          </div>
        </Match>
      </Switch>
    </div>
  );
};

关键说明

  • TanStack Query(包括Solid-Query)中,当需要让查询配置跟随响应式变量更新时,必须把配置项写成函数,这样每次查询触发时都会重新执行函数,获取最新的变量值。
  • 原代码中查询键已经用了响应式函数,所以能正确触发重新请求,但参数配置没做响应式处理,导致参数不更新。改成函数后,参数会和查询键同步更新。

内容的提问来源于stack exchange,提问作者user24492576

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 21:12:52