В React 19 мы представляем новую API для чтения ресурсов в процессе рендеринга: use.

Например, вы можете прочитать промис с помощью use, и React приостановит рендеринг до тех пор, пока промис не будет разрешен:

import { use } from 'react';
 
function Comments({ commentsPromise }) {
  // `use` приостановит рендеринг до тех пор, пока промис не будет разрешен.
  const comments = use(commentsPromise);
  return comments.map(comment => <p key={comment.id}>{comment}</p>);
}
 
function Page({ commentsPromise }) {
  // Когда `use` приостановит рендеринг в Comments,
  // будет показан этот Suspense boundary.
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <Comments commentsPromise={commentsPromise} />
    </Suspense>
  )
}

Примечание:

use не поддерживает промисы, созданные в процессе рендеринга.
Если вы попытаетесь передать промис, созданный в процессе рендеринга, в use, React выдаст предупреждение:

A component was suspended by an uncached promise. Creating promises inside a Client Component or hook is not yet supported, except via a Suspense-compatible library or framework.

Чтобы исправить это, вам нужно передать промис из библиотеки или фреймворка, поддерживающего Suspense и кэширование для промисов. В будущем мы планируем добавить функции, чтобы упростить кэширование промисов в процессе рендеринга.

Вы также можете читать контекст с помощью use, что позволяет вам условно читать контекст, например, после раннего возврата:

import { use } from 'react';
import ThemeContext from './ThemeContext'
 
function Heading({ children }) {
  if (children == null) {
    return null;
  }
  
  // Это не сработает с useContext
  // из-за раннего возврата.
  const theme = use(ThemeContext);
  return (
    <h1 style={{ color: theme.color }}>
      {children}
    </h1>
  );
}

API use может быть вызван только в процессе рендеринга, подобно хукам. В отличие от хуков, use может быть вызван условно. В будущем мы планируем поддерживать больше способов потребления ресурсов в процессе рендеринга с помощью use.


Назад