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

useRef输入值无法传入GraphQL mutation的原因排查

useRef值无法传入GraphQL Mutation的问题解决

问题根源

你在初始化useMutation时,直接把firstNameRef.current?.value和lastNameRef.current?.value写进了variables配置里。这部分代码只会在组件第一次渲染时执行,此时输入框还没被用户输入,current.value是空值。后续用户输入修改了ref的current值,但useMutation的variables不会自动更新——它不会监听ref的变化,只会保留初始化时的空值。

而你在createClient里能打印出正确值,是因为调用这个函数时,ref已经拿到了用户输入的最新内容,但这时候mutation的变量还是初始化时的空值,所以传进去的还是空的。

解决方案

最直接的办法是调用mutation时动态传入最新的变量值,而不是在useMutation初始化时固定死:

const firstNameRef = useRef();
const lastNameRef = useRef();

const createClientsModal = () => {
  return (
    <Modal
      modalHeader={<h2>Create New Terminal</h2>}
      hideButtons={false}
      buttonContent="Save"
      closeModal={setShow}
      click={createClient}
    >
      <>
        <label htmlFor="firstName">First Name</label>
        <Input
          style={{ marginTop: "10px", marginBottom: "25px" }}
          type="text"
          ref={firstNameRef}
        />
        <label htmlFor="lastName">Last Name</label>
        <Input style={{ marginTop: "10px" }} type="text" ref={lastNameRef} />
      </>
    </Modal>
  );
};

// 初始化useMutation时不需要写固定的variables
const [testCreate] = useMutation(CREATE_CLIENT, {
  errorPolicy: "all",
});

const createClient = () => {
  // 拿到当前最新的输入值
  const firstName = firstNameRef.current?.value;
  const lastName = lastNameRef.current?.value;
  console.log(firstName, lastName);
  
  // 调用mutation时传入实时变量
  testCreate({
    variables: {
      data: {
        clinic: {
          connect: {
            id: id,
          },
        },
        firstName,
        lastName,
      },
    },
  }).then(() => {
    refetch();
    setShow(false);
  });
};

补充说明

useRef的current属性变化不会触发组件重渲染,所以React不会重新执行useMutation的配置逻辑。这就导致初始化时的空变量一直被复用,直到你手动在调用时传入新值。这种动态传参的方式能确保每次调用mutation时,都是用的最新的用户输入内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:45:15