#javascript #reactjs #state #reset
#javascript #reactjs #состояние #Сброс
Вопрос:
У меня есть некоторое состояние в моем приложении, и я пытаюсь сбросить его значение при нажатии кнопки.
Когда страница отображается в первый раз, handleAllProjects
выполняется:
const [tagPage, setTagPage] = useState({});
const handleAllProjects = () => {
setTagPage({}) // didn't work
const allProjects = `https://api.fluxoresultados.com.br/portfolio/pag?limit=${cardLimit}`;
axios.get(allProjects)
.then(res => {
let cards = res.data
setCards(cards)
setTagPage({1: "", 2: cards[cards.length - 1]["id"]})
setCurrentPage(1)
console.log(currentPage) //line 61
console.log(tagPage) //line 62
})
.catch(err => {
console.log(err)
})
}
У меня также есть следующий обработчик событий нажатия кнопки:
const handleSelectButton = (id, tag) => {
if (id === pressedIndex) {
setPressedIndex('')
setTimeout(handleAllProjects, 500);
} else {
setPressedIndex(id)
setTimeout(() => handleTag(tag), 500);
}
}
}
Цель этой функции заключается в том, что она будет фильтровать проекты при первом нажатии, но при повторном нажатии она будет отображать все с помощью handleAllProjects
функции. На моей странице отображаются 6 проектов на карточках. setTagPage принимает «идентификатор» последнего проекта, потому что DynamoDB требует этого для разбивки на страницы. На этой странице есть фильтры для проектов. Когда я применяю фильтр, setTagPage принимает другой «идентификатор». Когда я удаляю фильтр (я возвращаюсь к состоянию, в котором страница отображается в первый раз). SetTagPage не сбрасывает значение, а выводит «идентификатор» страницы, как если бы все еще был фильтр.
Однако TagPage
переменная содержит тег вместо сброса в исходное состояние. Вот пример того, о чем я говорю — мне нужно console.log
, чтобы оператор в строке 62 был таким же, как и раньше.Как я могу сбросить это значение обратно в исходное состояние?
Комментарии:
1. Ваши
setTimeout
s будут выполняться немедленно в их текущей реализации, вы выполняете функцию и передаете ее результаты в тайм-аут, а не передаете саму функцию. (Это может быть допустимо, но в данном случае это не выглядит преднамеренным)2. Если вы используете
useState
для всех установленных функций, переменные состояния обновляются не сразу. Таким образом, вашиconsole.log
операторы, скорее всего, будут печатать устаревшие значения.3. Вам нужно
setTimeout(handleAllProjects, 500);
иsetTimeout(() => handleTag(tag), 500);
, или функция вызывается сразу, а не по истечении времени ожидания.4. @DBS Вы рекомендуете мне больше не использовать setTimeout?
5. @ChrisG я сделал это, но здесь не сработало … (также отредактировал код вопроса)