npx create-react-router@latest ejem0 --template remix-run/react-router-templates/minimal
Responder a todas las preguntas que si. Y ejecutar los siguientes comandos:
cd ejem0
npm iinstall
npm run dev
Si se obtiene el error de ENOSPC: System limit for number of file watchers reached, watch '/home/mica/git/react/ejem0' se debe ejecutar el comando
sudo sysctl fs.inotify.max_user_watches=524288 && sudo sysctl -p
Abrir la URL http://localhost:5173/
Instalar las React developer tools.
Vamos a cambiar el contenido del fichero routes/home.tsx por:
export default function Home() {
return (
<h1>
Curso React
</h1>
);
}
Vamos a dejar el contenido del fichero app.css vacío.
export default function Home() {
const name = "Anybody";
return (
<h1>
Hello {name}!
</h1>
);
}
| Atributo HTML | Atributo JSX (React) | Razón |
|---|---|---|
| class | className | class es palabra reservada en JS. |
| for | htmlFor | for es palabra reservada (bucles). |
| style="color: red" | style={{ color: 'red' }} | Los estilos en React deben ser objetos. |
| onclick | onClick | React usa camelCase para los eventos. |
| Tiene que ser bien formado |
import { useState } from "react";
export default function Home() {
const [name, setName] = useState("Anybody");
return (
<>
<h1>
Hello {name}!
</h1>
<button onClick={() => setName("John")}>
Hello John
</button >
</>
);
}
También se puede definir la función dentro de la función
import { useState } from "react";
export default function Home() {
const [name, setName] = useState("Anybody");
function handleClick() {
setName("John");
}
return (
<>
<h1>
Hello {name}!
</h1>
<button onClick={handleClick}>
Hello John
</button >
</>
);
}
import { useState } from "react";
export default function Home() {
const [name, setName] = useState("Anybody");
function handleClick() {
setName("John");
}
function onChange(e: React.ChangeEvent<HTMLInputElement>) {
setName(e.target.value);
}
return (
<>
<input type="text" value={name} onChange={onChange}/>
<h1>
Hello {name}!
</h1>
<button onClick={handleClick}>
Hello John
</button >
</>
);
}
Se ha cambiado la API REST de Google Books por otra gratuita (porque Google ha limitado el acceso)
Se ha configurado el proxy en la configuración de vite.
Se ha actualizado la API REST para empezar por "api" (Hay que actualizar la colección postman)
Hay que poner los comandos para arrancar las aplicaciones:
- Node:
npm installnpm start
- Java:
mvn spring-boot:run
Se usa la librería Zustand
Hay que indicar que existen los selectores, pero no los vamos a aplicar.
Hay que contar que se puede usar tanstack react query, pero no lo vamos a usar.
También indicar que se podría guardar en el local storage de forma automática (preferencias de navegación, claro/oscuro...)
Hay que actualizar el postman para incluir /api
Se configura ssr:false en react-router.config.ts
Se añade a root.tsx
export function HydrateFallback() { return
Loading...
; }Pendiente: Gestionar mejor los errores. Ahora si hay error de red
https://react-bootstrap.netlify.app/
npm install react-bootstrap bootstrap
npm install @mui/material @emotion/react @emotion/styled
npm install @fontsource/roboto
Add
import '@fontsource/roboto/300.css';
import '@fontsource/roboto/400.css';
import '@fontsource/roboto/500.css';
import '@fontsource/roboto/700.css';
npm install @mui/icons-material
https://reactrouter.com/how-to/spa
After running react-router build, deploy the build/client directory to whatever static host you prefer.
./build_and_publish.sh
Cambio en vite y en react-reouter config y en los routers de Spring y Express.
Cambios en los backends