在setState回调中调用setState可以吗?

时间:2020-09-03 20:50:43

标签: reactjs

我需要根据另一种状态的实际值来更新一种状态。感觉在另一个回调中设置状态是一个坏主意。

您知道是否有更好的解决方案?

const [day, setDay] = useState(null);
const [month, setMonth] = useState(day);

const onNextClick = useCallback(() => {
  setDay((day) => {
    const newDate = addDays(day, 1);
    if (newDate.getMonth() !== day.getMonth()) {
      setMonth((month) => addMonths(month, 1));
    }
    return newDate;
  });
}, []); // keep the function reference

1 个答案:

答案 0 :(得分:1)

这不是一个好习惯。根据{{​​3}}
您不必使用很多状态变量。状态变量可以很好地容纳对象和数组,因此您仍然可以将相关数据分组在一起。但是,与类中的this.setState不同,更新状态变量总是替换它而不是合并它。 在您的情况下,您可能会遇到这样的情况:

const [date, setDate] = useState(null);

const onNextClick = useCallback(() => {

setDate((date) => {
const newDate = addDays(date.day, 1);
if (newDate.getMonth() !== date.day.getMonth()) {
  const newMonth = addMonths(date.month, 1));
}
return {day: newDate, month:newMonth};
});
}, []); // keep the function reference

将日期作为具有日和月字段的对象。 希望对您有帮助。