Работа со стейтем в функциональных и классовых компонентах немного отличается, в том плане, что в классовых ты работаешь с полным объектом, типа такого: и можешь обращаться напрямую к его свойствам типа this.state.done В функциональных же ты не напрямую со стейтом работаешь, а с его свойствами типа так: Во втором случае у тебя стейт как бы всегда отсутствует, есть только его значения (которые могут быть пустыми). В первом же случае (в классовых) у тебя стейт может не быть, а может и быть. То есть если ты раз задал this.setState({done: true}), то у тебя this.state уже есть всегда в течение жизни компонента. Таким образом у тебя логическая ошибка в этом условии: У тебя всегда есть this.state и получается, что всегда задается done: true. То есть надо было проверять то есть проверять отсутствие стейта, а не его наличие. Ну, это в твоем случае. А вообще в таких случаях делают так: То есть устанавливают инвертированное значение.