React Hooks nos da la opción useState, y siempre veo las comparaciones Hooks vs Class-State. Pero, ¿qué pasa con los ganchos y algunas variables regulares?
Por ejemplo,
function Foo() {
let a = 0;
a = 1;
return <div>{a}</div>;
}
No utilicé Hooks, y me dará los mismos resultados que:
function Foo() {
const [a, setA] = useState(0);
if (a != 1) setA(1); // to avoid infinite-loop
return <div>{a}</div>;
}
Entonces, ¿cuál es la diferencia? Usar ganchos aún más complejo para ese caso ... Entonces, ¿por qué empezar a usarlo?
javascript
node.js
reactjs
react-hooks
Moshe Nagar
fuente
fuente
let a = 1; return <div>{a}</div>
y obtendrá el mismo resultado.Respuestas:
La razón es si
useState
vuelve a mostrar la vista. Las variables por sí mismas solo cambian bits en la memoria y el estado de su aplicación puede desincronizarse con la vista.Compara estos ejemplos:
En ambos casos, los
a
cambios al hacer clic, pero solo cuando utilizauseState
la vista, muestra correctamentea
el valor actual.fuente
a
será recolección de basura después de que termine de ejecutarse, mientras que en la primera, ya que aprovechauseState
, conservará el valor dea
useRef
si no quisiera volver a representar la vista. La pregunta sigue siendo si debe usar variables locales o Reaccionar referencias. Por ejemplo, si tiene un tiempo de espera que necesita borrar, o una solicitud http en curso usando axios, ¿almacena el tiempo de espera o la fuente de axios en una variable o en una referencia de React?useRef
(si no desea volver a procesar) ouseState
(si desea volver a procesar). En el caso de los temporizadores, ya que son efectos secundarios, deben iniciarse enuseEffect
gancho. Si lo deseatimerId
solo para fines de limpieza, puede mantenerlo en la variable local del controlador . Si desea poder borrar el temporizador de otro lugar del componente, debe usarlouseRef
. AlmacenamientotimerId
en un la variable local de componente sería un error ya que los vars locales se "restablecen" en cada render.La actualización del estado hará que el componente se vuelva a representar de nuevo, pero los valores locales no lo son.
En tu caso, representaste ese valor en tu componente. Eso significa que, cuando se cambia el valor, el componente se debe volver a representar para mostrar el valor actualizado.
Por lo tanto, será mejor usar
useState
que el valor local normal.fuente
Su primer ejemplo solo funciona porque los datos esencialmente nunca cambian. El punto de entrada del uso
setState
es volver a entregar todo su componente cuando el estado se cuelga. Entonces, si su ejemplo requirió algún tipo de cambio de estado o gestión, se dará cuenta rápidamente de que será necesario cambiar los valores y para actualizar la vista con el valor de la variable, necesitará el estado y la representación.fuente
es equivalente a
Lo que
useState
devuelve son dos cosas:si llama
setA(1)
, llamaríathis.setState({ a: 1 })
y activaría una nueva representación.fuente
Las variables locales se restablecerán en cada render tras la mutación, mientras que el estado se actualizará:
fuente