streakode

React 19

Ejercicios de React sobre React 19

9 ejercicios de React 19 en React. Piensa la respuesta antes de abrirla: la explicación dice por qué las demás opciones fallan.

  1. 1 · Elige la respuesta · nivel 2

    ¿Qué pasa mientras la promesa está pendiente?

    function Comments({ commentsPromise }) {  const comments = use(commentsPromise);  return comments.map((c) => <p key={c.id}>{c.text}</p>);}
    • AEl componente se suspende y se ve el fallback del <Suspense> más cercano
    • Bcomments vale undefined hasta que resuelve
    • CLanza un error y hay que envolverlo en try/catch
    • DReact bloquea el hilo hasta que resuelve
    Ver la respuesta

    Respuesta: A. El componente se suspende y se ve el fallback del <Suspense> más cercano

    use() lee el valor de una promesa: si está pendiente, suspende el componente y React muestra el fallback del Suspense más cercano hasta que resuelva.

  2. 2 · Elige la respuesta · nivel 2

    En React 19, ¿cómo recibe la prop ref un componente de función?

    • AComo cualquier otra prop: function Input({ ref }) {…}
    • BSolo si se envuelve en forwardRef
    • CCreándola con useRef dentro del hijo
    • DNo se puede pasar ref a componentes de función
    Ver la respuesta

    Respuesta: A. Como cualquier otra prop: function Input({ ref }) {…}

    Desde React 19, ref llega como una prop más a los componentes de función. forwardRef ya no es necesario y quedará obsoleto.

  3. 3 · Elige la respuesta · nivel 2

    En React 19, ¿qué valor lee useContext(ThemeContext) dentro de Toolbar?

    const ThemeContext = createContext("light"); function App() {  return (    <ThemeContext value="dark">      <Toolbar />    </ThemeContext>  );}
    • Adark
    • Blight
    • Cundefined: falta .Provider
    • DNinguno: un contexto no se puede renderizar
    Ver la respuesta

    Respuesta: A. dark

    Desde React 19, el propio contexto funciona como proveedor: <ThemeContext value=...>. <ThemeContext.Provider> sigue funcionando, pero quedará obsoleto. El valor por defecto solo se usa si no hay proveedor.

  4. 4 · Elige la respuesta · nivel 2

    Si saveLike falla, ¿qué muestra el botón cuando termina la acción?

    function LikeButton({ likes, saveLike }) {  const [shown, addLike] = useOptimistic(likes, (current, n) => current + n);  return (    <form action={async () => {      addLike(1);      await saveLike();    }}>      <button>♥ {shown}</button>    </form>  );}
    • AVuelve a mostrar el valor de likes
    • BSe queda con el +1
    • CNaN
    • DSe queda en blanco
    Ver la respuesta

    Respuesta: A. Vuelve a mostrar el valor de likes

    useOptimistic muestra un valor provisional mientras dura la acción. Al terminar, bien o mal, se descarta y se vuelve a mostrar likes. Si el guardado fue bien, el padre ya habrá actualizado likes.

  5. 5 · Elige la respuesta · nivel 2

    ¿Dónde hay que llamar a useFormStatus para saber si un formulario se está enviando?

    function SubmitButton() {  const { pending } = useFormStatus();  return <button disabled={pending}>Enviar</button>;}
    • AEn un componente que se renderiza dentro del <form>
    • BEn el mismo componente que renderiza el <form>
    • CEn cualquier parte de la aplicación
    • DSolo en un Server Component
    Ver la respuesta

    Respuesta: A. En un componente que se renderiza dentro del <form>

    useFormStatus lee el estado del <form> padre más cercano, así que no funciona en el componente que lo renderiza. Por eso el botón suele ser un componente aparte.

  6. 6 · Elige la respuesta · nivel 2

    En React 19, ¿cuándo se ejecuta la función que devuelve el callback ref?

    <div ref={(node) => {  const observer = new ResizeObserver(onResize);  observer.observe(node);  return () => observer.disconnect();}} />
    • ACuando el elemento se quita del DOM
    • BNunca: el valor devuelto se ignora
    • CJusto después de montarse
    • DEn cada render
    Ver la respuesta

    Respuesta: A. Cuando el elemento se quita del DOM

    Desde React 19, un callback ref puede devolver una función de limpieza, igual que un efecto. React la llama al desmontar el elemento. Antes había que detectar la llamada con node === null.

  7. 7 · Elige la respuesta · nivel 2

    ¿Qué pasa si cambia theme pero no roomId?

    function Chat({ roomId, theme }) {  const onConnected = useEffectEvent(() => {    showToast("Conectado", theme);  });   useEffect(() => {    const conn = connect(roomId);    conn.on("connected", onConnected);    return () => conn.close();  }, [roomId]);}
    • ANo se reconecta, y el aviso usará el theme nuevo
    • BSe cierra la conexión y se vuelve a abrir
    • CEl aviso usará el theme antiguo
    • DUn error: falta theme en las dependencias
    Ver la respuesta

    Respuesta: A. No se reconecta, y el aviso usará el theme nuevo

    useEffectEvent, estable desde React 19.2, crea una función que siempre ve las props y el estado más recientes pero no es una dependencia. El efecto solo reacciona a roomId.

  8. 8 · Elige la respuesta · nivel 2

    ¿Qué le pasa a Chat al cambiar a otra pestaña?

    <Activity mode={tab === "chat" ? "visible" : "hidden"}>  <Chat /></Activity>
    • ASe oculta pero conserva su estado, y sus efectos se limpian hasta que vuelva a verse
    • BSe desmonta y pierde el estado
    • CSigue visible debajo de la otra pestaña
    • DSe oculta, pero sus efectos siguen activos
    Ver la respuesta

    Respuesta: A. Se oculta pero conserva su estado, y sus efectos se limpian hasta que vuelva a verse

    <Activity>, añadido en React 19.2, oculta a sus hijos sin desmontarlos: conservan el estado y el DOM, pero los efectos se limpian y las actualizaciones pierden prioridad. Al volver a visible, los efectos se recrean.

  9. 9 · Ordena las líneas · nivel 2

    Ordena un formulario que use useActionState y desactive el botón mientras se envía.

    • <button disabled={pending}>Enviar</button>
    • <input name="email" />
    • </form>
    • <form action={submit}>
    • <form onSubmit={submit}>
    • );
    • const [error, submit, pending] = useActionState(signup, null);
    • return (
    • }
    • function Signup() {
    Ver la respuesta

    El orden correcto:

    function Signup() {  const [error, submit, pending] = useActionState(signup, null);  return (    <form action={submit}>      <input name="email" />      <button disabled={pending}>Enviar</button>    </form>  );}

    Sobran: <form onSubmit={submit}>

    useActionState devuelve [estado, acción, pendiente]. La acción se pasa a la prop action del form, que recibe el FormData automáticamente.

Más temas de React

Ver toda la ruta de React