Отключите Вспомогательную Функцию, Которая Не Обновляется При Внесении Изменений

#reactjs #jsx

Вопрос:

Вот Код, С Которым Я Работаю:

 function TodoCard() {
  const taskArray = [
    { todo: "pancakes", completed: false, id: 1 },
    { todo: "cornflakes", completed: false, id: 2 },
    { todo: "bananas", completed: false, id: 3 },
  ];

  const [tasks, setTasks] = useState(taskArray);

  function disabledHelper(task) {
    return task.completed === true ? true : false;
  }

  return (
    <div>
      <h1>Testing</h1>
      {tasks.map((task) => {
        return (
          <Button
            className="button"
            variant="contained"
            color="secondary"
            size="large"
            onClick={() => {
              task.completed = !task.completed;
              console.log(task.completed);
            }}
            key={task.todo}
            disabled={disabledHelper(task)}
          >
            {task.todo}
          </Button>
        );
      })}
    </div>
  );
}
 

Моя цель состоит в том, чтобы нажать кнопку, изменить «завершено» на «истина», и в результате кнопка станет отключенной. Журнал консоли на onclick подтвердил для меня, что он работал, однако функция disableHelper запускается только при загрузке страницы.

Я попытался вставить эффект использования, но он выдает ошибки, потому что я помещаю его здесь:

 disabled={useEffect(task => {
disableHelper(task)
})}
 

Я убежден, что мне нужно найти способ применить эффект использования в другом месте или попробовать новый метод все вместе, чтобы помощник запускался, когда я нажимаю кнопку

Есть какие-нибудь идеи о том, как я могу заставить это работать так, как я хочу?

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

1. Вы не должны изменять состояние непосредственно в обработчике onClick. Чтобы запустить повторный вызов, вы должны вызвать функцию setTasks() для обновления состояния.

Ответ №1:

Вопрос

Проблема здесь в том, что вы напрямую изменяете свой объект состояния, поэтому ваш компонент не перенаправляется с обновленным состоянием для повторного вычисления отключенного состояния.

Решение

Обновите свое состояние правильно. Используйте обновление функционального состояния, чтобы мелко скопировать предыдущее состояние в новый массив. Если идентификатор текущей задачи совпадает, скопируйте задачу и переключите статус завершено, в противном случае верните задачу.

 const toggleCompleted = id => {
  setTasks(tasks => tasks.map(task => {
    return task.id === id ? {
      ...task,
      completed: !task.completed
    } : task;
  }));
};
 

disabledHelper Утилита также полностью избыточна, так task.completed как уже является логическим, вы можете просто вернуть ее или, что еще более прямолинейно, установить disabled атрибут напрямую.

Я также предложил бы использовать свойство задачи id , так как, вероятно, есть лучшая гарантия уникальности.

 {tasks.map((task) => {
  return (
    <Button
      key={task.id}
      className="button"
      variant="contained"
      color="secondary"
      size="large"
      onClick={() => toggleCompleted(task.id)}
      disabled={task.completed}
    >
      {task.todo}
    </Button>
  );
})}
 

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

1. Все, что вы сказали, верно, спасибо вам за помощь