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

React三元运算符中如何同时调用两个函数?

React中调用多个函数的正确姿势

你遇到的问题核心是:setState(React的状态更新函数)的返回值是undefined,而&&逻辑与运算符只有在左侧表达式结果为真值时才会执行右侧代码,所以dispatch永远不会被触发。

下面给你几种解决方法,以及针对你代码的修正建议:

一、直接分号分隔(最推荐)

这是最直观、无陷阱的写法,就像你代码里else分支已经实现的那样:

setState(date);
dispatch(paypal_error({ time: date }));

把两个函数调用分开写,各自用分号结尾,逻辑清晰,不会出问题。

二、逗号表达式(适配三元运算符场景)

如果是在三元运算符里需要执行多个函数,可以用逗号表达式——逗号会依次执行所有表达式,最终返回最后一个的结果,同时确保每一步都执行:

// 三元运算符示例
minutes > pauseStartMin && minutes < pauseEndMin 
  ? (
      setState(new Date(0, 0, 0, pauseEndHour, pauseEndMinute + deliveryTime)),
      dispatch(paypal_error({ time: new Date(0, 0, 0, pauseEndHour, pauseEndMinute + deliveryTime) })),
      toast.error(`Zurzeit Pause. Bestellungen ab ${dayjs(newPauseEndHour.toString(), 'H').format('HH')}:${dayjs((newPauseEndMin + 1).toString(), 'm').format('mm')} Uhr wieder möglich`, { position: toast.POSITION.BOTTOM_RIGHT })
    )
  : (
      setState(date),
      dispatch(paypal_error({ time: date }))
    );

⚠️ 注意:必须用括号把多个表达式包裹起来,否则逗号的优先级会导致逻辑混乱。

三、封装成独立函数(适合重复逻辑)

如果这段“更新状态+dispatch”的逻辑会在多个地方用到,直接封装成一个函数更利于维护:

const handleValidDate = (date) => {
  setState(date);
  dispatch(paypal_error({ time: date }));
};

const handlePauseDate = () => {
  const targetDate = new Date(0, 0, 0, pauseEndHour, pauseEndMinute + deliveryTime);
  setState(targetDate);
  dispatch(paypal_error({ time: targetDate }));
  toast.error(`Zurzeit Pause. Bestellungen ab ${dayjs(newPauseEndHour.toString(), 'H').format('HH')}:${dayjs((newPauseEndMin + 1).toString(), 'm').format('mm')} Uhr wieder möglich`, {
    position: toast.POSITION.BOTTOM_RIGHT,
  });
};

// 在handleDateChange里调用
const handleDateChange = (date) => {
  setDisablePing(true);
  const minutes = parseInt(dayjs(date).format('HH') * 60) + parseInt(dayjs(date).format('m'));

  if (minutes > pauseStartMin && minutes < pauseEndMin) {
    handlePauseDate();
  } else {
    handleValidDate(date);
  }
};

针对你现有代码的修正

你代码里的if分支存在语法问题:没有用大括号包裹代码块,且用逗号分隔函数调用,这会导致只有第一个setState被执行,后面的dispatch和toast会被当作全局代码处理(甚至报错)。正确写法应该用大括号包裹,每个函数调用单独用分号结尾:

const handleDateChange = (date) => {
  setDisablePing(true);
  const minutes = parseInt(dayjs(date).format('HH') * 60) + parseInt(dayjs(date).format('m'));

  if (minutes > pauseStartMin && minutes < pauseEndMin) {
    const targetDate = new Date(0, 0, 0, pauseEndHour, pauseEndMinute + deliveryTime);
    setState(targetDate);
    dispatch(paypal_error({ time: targetDate }));
    toast.error(`Zurzeit Pause. Bestellungen ab ${dayjs(newPauseEndHour.toString(), 'H').format('HH')}:${dayjs((newPauseEndMin + 1).toString(), 'm').format('mm')} Uhr wieder möglich`, {
      position: toast.POSITION.BOTTOM_RIGHT,
    });
  } else {
    setState(date);
    dispatch(paypal_error({ time: date }));
  }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 08:01:02