Iniciar un proyecto React
Al momento de escribir esto, Vite es el build tool de referencia para React.
-
Crear con
npm create vite@latest nombre-del-proyecto. Esto mostrará un prompt para opciones donde podemos escoger React con JS o TS, y luego creará un directorio con./nombre-del-proyecto. -
Si estás en un monorepo cambia los nombres de los scripts en
package.jsonpara que no te vuelvas loco con el debugger de VSCode o la consola. Por ejemplo, el scriptdevpuede llamarsedevThisVeryAppy así en el listado de VSCode lo podrás diferencial, y te ayudará en el autocompletado de la consola. -
El comando
npm run devThisVeryAppdebe añadírsele--hostcomo argumento en elpackage.json, quedandovite --hostpara exponer el servidor a otras máquinas, ya que el desarrollo suelo hacerlo por VPN + SSH.
Ejemplo de scrips en un package.json
"scripts": {
"devPart5FrontEnd": "vite --host",
"buildPart5FrontEnd": "vite build",
"lintPart5FrontEnd": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
"previewPart5FrontEnd": "vite preview"
},
Pasar datos entre componentes
No olvides que los props de React no son más que pares de clave/valor, y que se pasan por referencia, igual que cualquier no-primitivo de JS.
No necesitas usar forwardRef ni useImperativeHandle
Aunque la parte 5 de Full Stack Open te indica que para mutar el estado interno de un componente hijo tienes que usar, además de useRef, forwardRef y useImperativeHandle, verás que convierte todo el código en algo demasiado bizarro, pero más importante no es necesario.
En mi repo de FSO tienes un ejemplo con App.jsx, Togglable.jsx y AddBlog.jsx.
¿Cómo?
-
Crea un
useRefen el componente padre. Así te evitas re-renders. -
Pásalo como prop al componente donde quieres definir el comportamiento. En este componente deberías tener una función que define este comportamiento. Simplemente asigna esta función tal que
props.nombreDelRef.current = { fnQueDefineComportamiento };.Ahora que has hecho esto, esta función podrá ser accedida desde el componente padre.
-
Ahora, en el padre podrás acceder a esa función con
nombreDelRef.current.fnQueDefineComportamiento(). Si lo puedes hacer desde el padre, puedes pasarla como prop a un componente hermano del primero.
¿Para qué?
En el repo enlazado el caso de uso es el siguiente: El componente que añade un blog a la lista debe ocultarse de la vista después de añadir un blog.
El problema es que el mostrado/ocultado se gestiona en un componente diferente, que envuelve al primero.