¿Por qué usar React Hook? State usa const y no permite

33

La forma estándar de usar un React useState Hook es la siguiente:

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

Sin embargo, esta const countvariable claramente se reasignará a un valor primitivo diferente.

¿Por qué entonces la variable no se define como let count?

Nacho
fuente
55
Si cambia el estado, el componente se volverá a representar claramente ¿verdad? Entonces, si se vuelve a representar, el recuento nunca será "reasignado"
Kevin.a
3
De hecho, en el alcance de la función, el recuento permanece inmutable. Gracias Kevin!
Nacho

Respuestas:

46

claramente va a ser reasignado a un valor primitivo diferente

Realmente no. Cuando el componente se vuelve a procesar, la función se ejecuta nuevamente, creando un nuevo ámbito, creando una nueva countvariable, que no tiene nada que ver con la variable anterior.

Ejemplo:

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

Nota: Los ganchos son mucho más sofisticados y en realidad no se implementan de esta manera. Esto es solo para demostrar un comportamiento similar.

Felix Kling
fuente
2

const es una protección contra la reasignación del valor de la referencia dentro del mismo alcance.

De MDN

No significa que el valor que posee es inmutable, solo que el identificador de variable no se puede reasignar.

también

Una constante no puede compartir su nombre con una función o una variable en el mismo ámbito.

Tony
fuente
1
Sin embargo, los valores primitivos son inmutables, por lo que la pregunta es más sobre cómo explicar cómo puede cambiar un número constante.
Fred Stark
0

aquí encontré que const era frustrante ya que el conteo necesita cambiar así

  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
  };
urfx
fuente