Vinnicius Gomes
  • Articles
  • About
  • Reading
  • Projects
  • Companies
  • Stack
  • Contact
Menu

July 8th, 2024 · 1yr ago

Explorando a nova API use do React 19: Simplificando a leitura de Promises e Contextos

Written by Vinnicius Gomes · 3 min read

main image
Foto de Galen Crout na Unsplash

O React 19 introduziu a nova API use, que traz uma abordagem simplificada e flexível para lidar com Promises e Contextos dentro dos componentes React. Neste artigo, vamos explorar os detalhes dessa API, seus benefícios e como ela pode mudar o dia a dia dos desenvolvedores React.

O que é a API use?

A API use permite que você leia o valor de um recurso, como uma Promise ou um contexto, de maneira mais flexível do que as abordagens anteriores. A sintaxe básica é:

1const value = use(resource);

Principais benefícios da API use

  1. Flexibilidade: Diferente dos hooks tradicionais, use pode ser chamado dentro de loops e condicionais.
  2. Integração com Suspense: use integra-se perfeitamente com Suspense, facilitando a renderização assíncrona.
  3. Leitura Simplificada de Contextos: Pode substituir o useContext, oferecendo mais flexibilidade ao ler valores de contexto.

Implementando a API use com Promises

Quando chamada com uma Promise, a API use suspende o componente até que a Promise seja resolvida. Vamos ver um exemplo:

Exemplo: Streaming de dados do servidor para o cliente

Vamos imaginar um cenário onde queremos buscar uma mensagem do servidor e exibi-la no cliente. Primeiro, criamos uma Promise no componente de servidor:

1import { fetchMessage } from './lib.js';
2import { Message } from './message.js';
3
4export default function App() {
5  const messagePromise = fetchMessage();
6  return (
7    <Suspense fallback={<p>waiting for message...</p>}>
8      <Message messagePromise={messagePromise} />
9    </Suspense>
10  );
11}

No componente de cliente, utilizamos a API use para ler o valor da Promise:

1'use client';
2
3import { use } from 'react';
4
5export function Message({ messagePromise }) {
6  const messageContent = use(messagePromise);
7  return <p>Here is the message: {messageContent}</p>;
8}

Tratando Promises rejeitadas

Se a Promise for rejeitada, podemos tratar o erro utilizando um Error Boundary ou fornecendo um valor alternativo com Promise.catch.

1import { use, Suspense } from "react";
2import { ErrorBoundary } from "react-error-boundary";
3
4export function MessageContainer({ messagePromise }) {
5  return (
6    <ErrorBoundary fallback={<p>⚠️Something went wrong</p>}>
7      <Suspense fallback={<p>⌛Downloading message...</p>}>
8        <Message messagePromise={messagePromise} />
9      </Suspense>
10    </ErrorBoundary>
11  );
12}
13
14function Message({ messagePromise }) {
15  const content = use(messagePromise);
16  return <p>Here is the message: {content}</p>;
17}

Com Promise.catch:

1import { Message } from './message.js';
2
3export default function App() {
4  const messagePromise = new Promise((resolve, reject) => {
5    reject();
6  }).catch(() => {
7    return "no new message found.";
8  });
9
10  return (
11    <Suspense fallback={<p>waiting for message...</p>}>
12      <Message messagePromise={messagePromise} />
13    </Suspense>
14  );
15}

Usando a API use com Contextos

Quando um contexto é passado para use, ele funciona de maneira similar ao useContext, mas com a vantagem de poder ser chamado dentro de condicionais e loops.

Exemplo: Leitura de Contexto com use

Vamos ver como usar use para ler um contexto de tema:

1import { createContext, use } from 'react';
2
3const ThemeContext = createContext(null);
4
5export default function MyApp() {
6  return (
7    <ThemeContext.Provider value="dark">
8      <Form />
9    </ThemeContext.Provider>
10  )
11}
12
13function Form() {
14  return (
15    <Panel title="Welcome">
16      <Button show={true}>Sign up</Button>
17      <Button show={false}>Log in</Button>
18    </Panel>
19  );
20}
21
22function Panel({ title, children }) {
23  const theme = use(ThemeContext);
24  const className = 'panel-' + theme;
25  return (
26    <section className={className}>
27      <h1>{title}</h1>
28      {children}
29    </section>
30  )
31}
32
33function Button({ show, children }) {
34  if (show) {
35    const theme = use(ThemeContext);
36    const className = 'button-' + theme;
37    return <button className={className}>{children}</button>;
38  }
39  return null;
40}

Neste exemplo, use é utilizado dentro de um if para ler o contexto ThemeContext.

Conclusão

A API use do React 19 traz uma nova abordagem para a leitura de Promises e Contextos, oferecendo mais flexibilidade e integração com Suspense. Essa API promete simplificar a vida dos desenvolvedores, tornando o código mais limpo e fácil de manter.

This post is licensed under CC BY 4.0 by the author. ·

loading...

Share:

linkedingithubxinstagrammediumproduct hunt

©2026 Vinnicius Gomes

Created in

BR