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
相关产品推荐
相关产品推荐

