function App() {
return <h1>Hello</h1>;
} Componente de función
const App = () => <h1>Hello</h1>;
Componente con arrow function
function Greet({ name }) {
return <p>Hi {name}</p>;
} Componente con props
export default App;
Exportar componente como default
<App title="Hi" count={5} /> Usar componente con props
<> <A /> <B /> </>
Fragmento (sin wrapper)
{items.map(item => <li key={item.id}>{item.name}</li>)} Renderizar lista con keys
{condition && <Alert />} Render condicional (and)
{loading ? <Spinner /> : <Data />} Render condicional (ternario)
<div className="btn primary">Click</div>
Clase CSS (className)
<div style={{color: 'red', fontSize: 14}}>X</div> Estilos inline (objeto)
<button onClick={() => setN(n + 1)}>+</button> Event handler
const [count, setCount] = useState(0);
Estado con valor inicial
setCount(count + 1);
Actualizar estado
setCount(c => c + 1);
Actualización funcional
setUser({...user, name: 'Alice'}); Actualizar objeto con spread
setItems([...items, newItem]);
Añadir a array estado
useEffect(() => {
fetchData();
}, []); Ejecutar al montar
useEffect(() => {
...
}, [dep1, dep2]); Ejecutar cuando cambian deps
useEffect(() => {
const id = setInterval(...);
return () => clearInterval(id);
}, []); Effect con cleanup
const ref = useRef(null);
<input ref={ref} /> Ref del DOM
const renders = useRef(0);
Ref mutable (sin re-render)
const value = useMemo(() => expensive(x), [x]);
Memoizar cálculo
const fn = useCallback(() => doThing(x), [x]);
Memoizar callback
const theme = useContext(ThemeContext);
Consumir context
const [state, dispatch] = useReducer(reducer, initial);
Patrón reducer
function useDebounce(value, delay) { ... } Hook personalizado
const [email, setEmail] = useState('');
<input value={email} onChange={e => setEmail(e.target.value)} /> Input controlado
<input type="checkbox" checked={on} onChange={e => setOn(e.target.checked)} /> Checkbox controlado
<form onSubmit={e => { e.preventDefault(); submit(); }}> Manejador de submit
<input ref={inputRef} defaultValue="hi" /> Input no controlado (ref)
const ThemeContext = createContext('light'); Crear context
<ThemeContext.Provider value="dark"> <App /> </ThemeContext.Provider>
Proveer valor de context
<BrowserRouter>
<Routes>
<Route path="/" element={<Home />} />
</Routes>
</BrowserRouter> Rutas básicas
<Link to="/about">About</Link>
Enlace de navegación
const navigate = useNavigate();
navigate('/home'); Navegación programática
const { id } = useParams(); Leer parámetros de URL
const [params] = useSearchParams();
Leer query string
const Button = React.memo(({ onClick }) => ...); Memoizar componente
const Heavy = lazy(() => import('./Heavy'));
<Suspense fallback={<Loader/>}><Heavy /></Suspense> Code splitting con Suspense
Cheat Sheet de React — Hooks, Componentes, JSX y Context API
React apareció en 2013 con JSX y componentes de clase; el modelo de funciones más hooks de 2019 es el enfoque recomendado desde entonces, y la mayoría del código React de hoy se parece más a una lista de funciones puras de render que al ciclo de vida original. La chuleta de abajo cubre más de 40 patrones entre componentes, hooks, formularios, contexto, rutas y rendimiento. La mayoría de los líos en componentes reales no vienen de olvidar la sintaxis de JSX. Vienen de rarezas que parecen normales pero muerden. Un `useEffect` que lee un valor de estado sin listarlo en el array de dependencias lee el valor del render que creó el efecto, no el más reciente. Una lista sin un `key` estable reutiliza nodos del DOM en órdenes inesperados al reordenarse. Estos son los fragmentos que se acaban consultando al depurar precisamente eso: el array de dependencias que corta un bucle de efecto, el updater funcional que sobrevive al batching, el cleanup que detiene un intervalo, sin tener que releer la referencia de React desde la línea uno cada vez.
Trampas habituales en React
Hay un puñado de patrones que merecen estar en la primera pantalla de cualquier componente de React. El updater funcional `setCount(c => c + 1)` debería sustituir a la forma con valor siempre que el nuevo estado dependa del anterior: sobrevive al batching y evita el clásico bug del contador que se queda corto. Los arrays de dependencias de los efectos deberían listar cada valor reactivo que el efecto lee, incluidos props, estado y funciones declaradas dentro del componente; conviene mantener activa la regla `react-hooks/exhaustive-deps` de ESLint, porque los casos que detecta casi siempre son bugs reales de stale closure. Las listas necesitan un `key` estable que venga del propio dato, no del índice del array: los índices se desplazan al reordenar y confunden al reconciler. Las funciones de cleanup que devuelve `useEffect` importan para intervalos, suscripciones y listeners — además del desmontaje, se ejecutan en cada re-ejecución cuando cambian sus dependencias. La chuleta agrupa esto en Componentes, Hooks, Formularios, Contexto, Rutas y Rendimiento para que la sección adecuada esté a un clic.
- Más de 40 patrones de React con JSX
- Cobertura completa de hooks
- Formularios controlados y submit
- Context API y providers
- Rutas con React Router v6
- React.memo y lazy loading
Gratis. Sin registro. Tus datos permanecen en tu navegador. Anuncios mediante Google AdSense (con consentimiento).
Por Marco B. ·