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

React Zustand确认对话框无法获取用户拒绝返回值求助

问题:Zustand确认对话框无法捕获用户拒绝的回调

刚接触Zustand,我实现了一个确认对话框,基础功能可用,但无法获取用户拒绝对话框时的返回值,不知道问题出在哪。

当前调用代码:

confirmDialog("Are you sure?", (userAccepted) => {                  
  replace(userAccepted)
})
// 用户拒绝对话框时无法执行代码,confirmDialog返回void
function replace(userAccepted: boolean) {
 ...
}

我的Store代码:

import { Dialog, DialogTitle, DialogContent, DialogActions, Button, Box, IconButton, Alert } from "@pankod/refine-mui"

import create from "zustand"

type ConfirmDialogStore = {
   message: string
   onSubmit?: (userAccepted: boolean) => void
   close: () => void
}

const useConfirmDialogStore = create<ConfirmDialogStore>((set) => ({
   // 状态及默认值
   message: "",
   onSubmit: undefined,
   // 通过close方法更新状态
   close: () => set({ onSubmit: undefined }),
}))

export const confirmDialog = (message: string, onSubmit: (userAccepted: boolean) => void) => {
   // 更新Store
   useConfirmDialogStore.setState({
      message,
      onSubmit,
   })
}

const ConfirmDialog = () => {
   // 读取Store
   const { message, onSubmit, close } = useConfirmDialogStore()

   // 当onSubmit存在时渲染对话框
   return (
      <Dialog
         open={Boolean(onSubmit)}
         onClose={close}
         maxWidth="sm"
         fullWidth
      >
         <Box
            display="flex"
            justifyContent="space-between"
            alignItems="center"
         >
            <DialogTitle>你确定吗?</DialogTitle>
            <IconButton onClick={close}>{/* <Close /> */}</IconButton>
         </Box>
         <DialogContent>
            <Alert severity="error">{message}</Alert>
         </DialogContent>
         <DialogActions sx={{ padding: (theme) => theme.spacing(2) }}>
            <Button
               color="primary"
               variant="contained"
               onClick={close}
            >
               取消
            </Button>
            <Button
               color="secondary"
               variant="contained"
               onClick={() => {
                  if (onSubmit) {
                     onSubmit(true)
                  }
                  close()
               }}
            >
               确认
            </Button>
         </DialogActions>
      </Dialog>
   )
}

export default ConfirmDialog
问题原因与解决方法

问题根源

目前只有「确认」按钮触发了onSubmit(true),而「取消」按钮、对话框关闭按钮(叉号)、点击遮罩层关闭这几种用户拒绝操作的场景,只调用了close(),没有触发onSubmit(false),所以回调函数拿不到拒绝的状态。

修改方案

需要在所有用户拒绝的操作中,先调用onSubmit(false)再关闭对话框,还可以封装重复逻辑避免冗余:

const ConfirmDialog = () => {
   const { message, onSubmit, close } = useConfirmDialogStore()

   // 封装拒绝操作的统一逻辑
   const handleReject = () => {
      if (onSubmit) {
         onSubmit(false)
      }
      close()
   }

   return (
      <Dialog
         open={Boolean(onSubmit)}
         onClose={handleReject} // 处理遮罩层关闭
         maxWidth="sm"
         fullWidth
      >
         <Box
            display="flex"
            justifyContent="space-between"
            alignItems="center"
         >
            <DialogTitle>你确定吗?</DialogTitle>
            <IconButton onClick={handleReject}>{/* <Close /> */}</IconButton> // 处理叉号关闭
         </Box>
         <DialogContent>
            <Alert severity="error">{message}</Alert>
         </DialogContent>
         <DialogActions sx={{ padding: (theme) => theme.spacing(2) }}>
            <Button
               color="primary"
               variant="contained"
               onClick={handleReject} // 处理取消按钮
            >
               取消
            </Button>
            <Button
               color="secondary"
               variant="contained"
               onClick={() => {
                  if (onSubmit) {
                     onSubmit(true)
                  }
                  close()
               }}
            >
               确认
            </Button>
         </DialogActions>
      </Dialog>
   )
}

修改后,用户无论是点击取消、关闭按钮还是遮罩层,都会触发onSubmit(false),回调函数就能捕获到拒绝状态并执行对应逻辑了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 17:16:08