Нормально ли вызывать setState при обратном вызове setState?

#reactjs

#reactjs ( реакция ) #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:

Это не очень хорошая практика. согласно https://reactjs.org/docs/hooks-state.html
Вам не нужно использовать много переменных состояния. Переменные состояния могут прекрасно содержать объекты и массивы, так что вы все равно можете группировать связанные данные вместе. Однако, в отличие от 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
  

обработка даты как объекта с полями дня и месяца.
надеюсь, это поможет.

Комментарии:

1. Где именно сказано, что это небезопасно? Я не смог его найти.

2. Я хотел сказать, что это не очень хорошая практика. это создает что-то, что соответствует вашему сценарию, и это использует объект или массив в качестве объекта состояния. то, что вы сделали, не является хорошей практикой. рассмотрите возможность обновления еще 3 переменных состояния.