Haczyki React dają nam opcję useState i zawsze widzę porównania Hooks vs Klasa-Stan. Ale co z hakami i niektórymi regularnymi zmiennymi?
Na przykład,
function Foo() {
let a = 0;
a = 1;
return <div>{a}</div>;
}
Nie użyłem Haków, a to da mi takie same wyniki jak:
function Foo() {
const [a, setA] = useState(0);
if (a != 1) setA(1); // to avoid infinite-loop
return <div>{a}</div>;
}
Czym więc jest różnica? Korzystanie z haków jeszcze bardziej skomplikowane w tym przypadku ... Więc po co z tego korzystać?
javascript
node.js
reactjs
react-hooks
Mosze Nagar
źródło
źródło
let a = 1; return <div>{a}</div>
i uzyskasz ten sam wynik.Odpowiedzi:
Powodem jest to,
useState
że ponownie wyświetla widok. Zmienne same w sobie zmieniają tylko bity w pamięci, a stan Twojej aplikacji może zsynchronizować się z widokiem.Porównaj te przykłady:
W obu przypadkach
a
zmienia się po kliknięciu, ale tylko przyuseState
prawidłowym użyciu widoku pokazujea
aktualną wartość.źródło
a
będzie śmieciami zbieranymi po zakończeniu wykonywania, podczas gdy w pierwszym przypadku, ponieważ wykorzystujeuseState
wartość, zachowa wartośća
useRef
gdyby nie chciał ponownie renderować widoku. Pozostaje pytanie, czy powinien on używać zmiennych lokalnych czy referencji React. Np. Jeśli masz limit czasu, który musisz wyczyścić, lub bieżące żądanie HTTP za pomocą axios, czy przechowujesz limit czasu lub źródło axios w zmiennej lub w React ref?useRef
(jeśli nie chcesz ponownie wysłać) lubuseState
(jeśli chcesz ponownie wysłać). W przypadku timerów, ponieważ są to działania niepożądane, należy je rozpocząć oduseEffect
razu. Jeśli chcesztimerId
tylko do celów czyszczenia, możesz zachować go w zmiennej lokalnej programu obsługi . Jeśli chcesz mieć możliwość wyczyszczenia timera z innego miejsca w komponencie, powinieneś użyćuseRef
. PrzechowywanietimerId
w lokalnej zmiennej komponentu byłoby błędem, ponieważ lokalne zmienne są „resetowane” na każdym renderowaniu.Aktualizacja stanu spowoduje ponowne renderowanie komponentu, ale nie są to wartości lokalne.
W twoim przypadku wyrenderowałeś tę wartość w swoim komponencie. Oznacza to, że po zmianie wartości komponent powinien zostać zrenderowany, aby pokazać zaktualizowaną wartość.
Dlatego lepiej będzie użyć
useState
niż normalnej wartości lokalnej.źródło
Twój pierwszy przykład działa tylko dlatego, że dane zasadniczo nigdy się nie zmieniają. Punktem wejścia użycia
setState
jest ponowne przesłanie całego komponentu, gdy stan się zmieni. Jeśli więc twój przykład wymagał zmiany stanu lub zarządzania stanem, szybko zdasz sobie sprawę, że konieczne będą zmiany wartości i aby zaktualizować widok o wartość zmiennej, będziesz potrzebować stanu i ponownego wyrenderowania.źródło
jest równa
Jakie
useState
zwroty to dwie rzeczy:jeśli zadzwonisz
setA(1)
, zadzwoniszthis.setState({ a: 1 })
i uruchom ponownie renderowanie.źródło
Zmienne lokalne zostaną zresetowane przy każdym renderowaniu po mutacji, a stan zaktualizuje:
źródło