Wpis z mikrobloga

Jak zrobić w React, że po wciśnięciu klawisza Escape zostanie zmieniona wartość w state "confirm" na "true", a ponowne wciśnięcie Escape uruchomi skrypt secPress()?

const [confirm, setConfirm] = useState(false);

const _confirm = () => {
if (confirm) {
secPress();
} else {
setConfirm(true);
}
console.log(confirm); // <-- zwraca zawsze false
};

useKeypress("Escape", () => {
_confirm();
console.log("test"); // <-- zwraca "test"
});

Źródło useKeypress Hook na Gist

#programowanie #javascript #react
  • 32
  • Odpowiedz
@aptitude: tak naprawde wszystko w kodzie jest ok tylko tyle ze setState działa lekko inaczej niż sobie wyobrażasz.
Gdy wykonuje sie setConfirm(true) to zmienna confirm nie uzyska natychmiast nowej wartości, a dopiero wtedy gdy ponownie zostanie odpalony hook useState (tylko tam w Twoim kodzie jest bezposrednie przypisanie do zmiennej confirm i to jest poprawne podejscie). A z kolei hook zostanie odpalony dopiero w kolejnej rundzie rerenderowania komponentu.
Zrob sobie console.log(confirm) zaraz
  • Odpowiedz
@aptitude: Twój komponent mi wyświetla asd po pierwszym kliknięciu esc i po drugim odpala dodatkowo secPress czyli zakładam, że działa dobrze
  • Odpowiedz
@lobo: tak powinno być, tylko u mnie po pierwszym wciśnięciu esc uruchamia już secPress().
Hmm, ale jak u ciebie działa to zobaczę co jest nie tak u mnie, dzięki za pomoc
  • Odpowiedz