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

NextJS:如何在JSX中调用函数,实现Tanstack React Query提交成功后关闭模态框

解决Tanstack React Query请求成功后关闭模态框的问题

你之前在JSX中直接写{isSuccess ? props.onClose : null}无效的核心原因是:JSX表达式仅会渲染值(字符串、React元素等),不会自动执行函数。这种写法只是把onClose函数作为无意义的值插入DOM,根本不会触发函数执行。

下面提供两种可靠的解决方案:

方案1:利用React Query的onSuccess回调(推荐)

React Query的useMutation原生提供了onSuccess钩子,专门用于处理请求成功后的操作,完全贴合库的设计逻辑:

import { useMutation } from '@tanstack/react-query';

const YourModal = ({ onClose }) => {
  const { mutate } = useMutation({
    mutationFn: (formData) => {
      // 你的POST请求逻辑
      return fetch('/your-api-endpoint', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(formData),
      });
    },
    // 请求成功后直接调用关闭函数
    onSuccess: () => onClose(),
  });

  const handleSubmit = (e) => {
    e.preventDefault();
    const formData = /* 收集你的表单数据 */;
    mutate(formData);
  };

  return (
    <div className="modal">
      <form onSubmit={handleSubmit}>
        {/* 表单内容 */}
        <button type="submit">提交</button>
      </form>
      <button onClick={onClose}>×</button>
    </div>
  );
};

如果需要根据不同提交场景做差异化处理,也可以在调用mutate时动态指定onSuccess:

const handleSubmit = (e) => {
  e.preventDefault();
  const formData = /* 收集表单数据 */;
  mutate(formData, {
    onSuccess: () => onClose(),
  });
};

方案2:用React的useEffect监听isSuccess状态

如果需要结合其他状态逻辑判断是否关闭模态框,可以用useEffect监听isSuccess的变化,当状态变为true时触发关闭:

import { useEffect } from 'react';
import { useMutation } from '@tanstack/react-query';

const YourModal = ({ onClose }) => {
  const { mutate, isSuccess, reset } = useMutation({
    mutationFn: (formData) => {
      // 你的POST请求逻辑
      return fetch('/your-api-endpoint', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(formData),
      });
    },
  });

  // 监听isSuccess状态,成功时关闭模态框
  useEffect(() => {
    if (isSuccess) {
      onClose();
      // 可选:重置success状态,避免组件重渲染时重复触发关闭
      reset();
    }
  }, [isSuccess, onClose, reset]);

  const handleSubmit = (e) => {
    e.preventDefault();
    const formData = /* 收集表单数据 */;
    mutate(formData);
  };

  return (
    <div className="modal">
      <form onSubmit={handleSubmit}>
        {/* 表单内容 */}
        <button type="submit">提交</button>
      </form>
      <button onClick={onClose}>×</button>
    </div>
  );
};

注意:调用reset()是为了将isSuccess重置为false,避免后续组件因其他原因重渲染时,再次触发关闭逻辑。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:15:40