React Hook nedenState, const kullanıyor ve izin vermiyor


33

React useState Hook'u kullanmanın standart yolu şudur:

const [count, setCount] = useState(0);

Ancak bu const countdeğişken açıkça farklı bir ilkel değere atanacaktır.

O zaman değişken neden olarak tanımlanmadı let count?


5
Durumu değiştirirseniz, bileşen açıkça yeniden oluşturulacak değil mi? Bu yüzden, yeniden
sayarsa

3
Gerçekten de, fonksiyon kapsamında sayım değişmez kalır. Teşekkürler Kevin!
Nacho

Yanıtlar:


46

açıkça farklı bir ilkel değere atanacak

Pek sayılmaz. Bileşen yeniden oluşturulduğunda, işlev yeniden yürütülür, yeni bir kapsam oluşturur countve önceki değişkenle ilgisi olmayan yeni bir değişken oluşturur .

Misal:

let _state;
let _initialized = false;
function useState(initialValue) {
  if (!_initialized) {
    _state = initialValue;
    _initialized = true;
  }
  return [_state, v => _state = v];
}

function Component() {
  const [count, setCount] = useState(0);

  console.log(count);
  setCount(count + 1);
}

Component();
Component(); // in reality `setCount` somehow triggers a rerender, calling Component again
Component(); // another rerender

Not: Kancalar çok daha karmaşıktır ve aslında bu şekilde uygulanmaz. Bu sadece benzer bir davranışı göstermek içindir.


2

const referansın değerini aynı kapsamda yeniden atamaya karşı bir korumadır.

Gönderen MDN'yi

Sahip olduğu değerin değişmez olduğu anlamına gelmez, sadece değişken tanımlayıcının yeniden atanamayacağı anlamına gelir.

Ayrıca

Sabit, adını aynı kapsamdaki bir işlev veya değişkenle paylaşamaz.


1
İlkel değerler değişmez olsa da, soru daha çok bir sabit numaranın nasıl değişebileceğini açıklamakla ilgilidir?
Fred Stark


0

burada sayının değişmesi gerektiğinden const'un sinir bozucu olduğunu buldum

  let [count, setCount] = useState(0)
  // simply can't use ++ on either side of count increment given we declare as const [count, setCount] 
  // instead declaration of var or let [count, setCount] allows simpler code
  const increment = () => {
    setCount(count++); //const cannot do this only let or var
  };
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.