Deutsch

Entdecken Sie effizienten Datenabruf in React mit Suspense! Erforschen Sie verschiedene Strategien, vom Laden auf Komponentenebene bis zum parallelen Datenabruf, und erstellen Sie reaktionsschnelle, benutzerfreundliche Anwendungen.

React Suspense: Datenabrufstrategien für moderne Anwendungen

React Suspense ist eine leistungsstarke Funktion, die in React 16.6 eingeführt wurde und die Handhabung asynchroner Operationen, insbesondere des Datenabrufs, vereinfacht. Sie ermöglicht es Ihnen, das Rendern von Komponenten zu "unterbrechen", während auf das Laden von Daten gewartet wird, und bietet so eine deklarativere und benutzerfreundlichere Methode zur Verwaltung von Ladezuständen. Dieser Leitfaden untersucht verschiedene Datenabrufstrategien mit React Suspense und bietet praktische Einblicke in den Aufbau reaktionsschneller und performanter Anwendungen.

React Suspense verstehen

Bevor wir uns mit spezifischen Strategien befassen, lassen Sie uns die Kernkonzepte von React Suspense verstehen:

Datenabrufstrategien mit Suspense

Hier sind mehrere effektive Datenabrufstrategien, die React Suspense nutzen:

1. Datenabruf auf Komponentenebene

Dies ist der unkomplizierteste Ansatz, bei dem jede Komponente ihre eigenen Daten innerhalb einer Suspense-Grenze abruft. Er eignet sich für einfache Komponenten mit unabhängigen Datenanforderungen.

Beispiel:

Nehmen wir an, wir haben eine UserProfile-Komponente, die Benutzerdaten von einer API abrufen muss:

// A simple data fetching utility (replace with your preferred library)
const fetchData = (url) => {
  let status = 'pending';
  let result;
  let suspender = fetch(url)
    .then(res => {
      if (!res.ok) {
        throw new Error(`HTTP error! Status: ${res.status}`);
      }
      return res.json();
    })
    .then(
      res => {
        status = 'success';
        result = res;
      },
      err => {
        status = 'error';
        result = err;
      }
    );

  return {
    read() {
      if (status === 'pending') {
        throw suspender;
      } else if (status === 'error') {
        throw result;
      }
      return result;
    }
  };
};

const userResource = fetchData('/api/user/123');

function UserProfile() {
  const user = userResource.read();
  return (
    <div>
      <h2>{user.name}</h2>
      <p>Email: {user.email}</p>
    </div>
  );
}

function App() {
  return (
    <Suspense fallback={<div>Loading user data...</div>}>
      <UserProfile />
    </Suspense>
  );
}

Erklärung:

Vorteile:

Nachteile:

2. Paralleler Datenabruf

Um Wasserfall-Abrufe zu vermeiden, können Sie mehrere Datenanfragen gleichzeitig initiieren und Promise.all oder ähnliche Techniken verwenden, um auf alle zu warten, bevor die Komponenten gerendert werden. Dies minimiert die gesamte Ladezeit.

Beispiel:

const userResource = fetchData('/api/user/123');
const postsResource = fetchData('/api/user/123/posts');

function UserProfile() {
  const user = userResource.read();
  const posts = postsResource.read();

  return (
    <div>
      <h2>{user.name}</h2>
      <p>Email: {user.email}</p>
      <h3>Posts:</h3>
      <ul>
        {posts.map(post => (<li key={post.id}>{post.title}</li>))}
      </ul>
    </div>
  );
}

function App() {
  return (
    <Suspense fallback={<div>Loading user data and posts...</div>}>
      <UserProfile />
    </Suspense>
  );
}

Erklärung:

Vorteile:

Nachteile:

3. Selektive Hydration (für Server-Side Rendering - SSR)

Bei der Verwendung von Server-Side Rendering (SSR) kann Suspense dazu verwendet werden, Teile der Seite selektiv zu hydrieren. Das bedeutet, Sie können die Hydrierung der wichtigsten Teile der Seite priorisieren, was die Time to Interactive (TTI) und die wahrgenommene Leistung verbessert. Dies ist nützlich in Szenarien, in denen Sie das grundlegende Layout oder den Kerninhalt so schnell wie möglich anzeigen möchten, während die Hydrierung weniger kritischer Komponenten aufgeschoben wird.

Beispiel (Konzeptuell):

// Server-side:
<Suspense fallback={<div>Loading critical content...</div>}>
  <CriticalContent />
</Suspense>
<Suspense fallback={<div>Loading optional content...</div>}>
  <OptionalContent />
</Suspense>

Erklärung:

Vorteile:

Nachteile:

4. Datenabruf-Bibliotheken mit Suspense-Unterstützung

Mehrere beliebte Datenabruf-Bibliotheken haben eine integrierte Unterstützung für React Suspense. Diese Bibliotheken bieten oft eine bequemere und effizientere Möglichkeit, Daten abzurufen und mit Suspense zu integrieren. Einige bemerkenswerte Beispiele sind:

Beispiel (mit SWR):

import useSWR from 'swr'

const fetcher = (...args) => fetch(...args).then(res => res.json())

function UserProfile() {
  const { data: user, error } = useSWR('/api/user/123', fetcher, { suspense: true })

  if (error) return <div>failed to load</div>
  if (!user) return <div>loading...</div> // This is likely never rendered with Suspense

  return (
    <div>
      <h2>{user.name}</h2>
      <p>Email: {user.email}</p>
    </div>
  )
}

function App() {
  return (
    <Suspense fallback={<div>Loading user data...</div>}>
      <UserProfile />
    </Suspense>
  );
}

Erklärung:

Vorteile:

Nachteile:

Fehlerbehandlung mit Suspense

Die Fehlerbehandlung ist entscheidend bei der Verwendung von Suspense. React stellt eine ErrorBoundary-Komponente bereit, um Fehler abzufangen, die innerhalb von Suspense-Grenzen auftreten.

Beispiel:

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  static getDerivedStateFromError(error) {
    // Update state so the next render will show the fallback UI.
    return { hasError: true };
  }

  componentDidCatch(error, errorInfo) {
    // You can also log the error to an error reporting service
    console.error(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // You can render any custom fallback UI
      return <h1>Something went wrong.</h1>;
    }

    return this.props.children; 
  }
}

function App() {
  return (
    <ErrorBoundary>
      <Suspense fallback={<div>Loading...</div>}>
        <UserProfile />
      </Suspense>
    </ErrorBoundary>
  );
}

Erklärung:

Best Practices für die Verwendung von React Suspense

Praxisbeispiele

React Suspense kann in verschiedenen Szenarien angewendet werden, darunter:

Beispiel 1: Internationale E-Commerce-Plattform

Stellen Sie sich eine E-Commerce-Plattform vor, die Kunden in verschiedenen Ländern bedient. Produktdetails wie Preise und Beschreibungen müssen möglicherweise basierend auf dem Standort des Benutzers abgerufen werden. Suspense kann verwendet werden, um eine Ladeanzeige anzuzeigen, während die lokalisierten Produktinformationen abgerufen werden.

function ProductDetails({ productId, locale }) {
  const productResource = fetchData(`/api/products/${productId}?locale=${locale}`);
  const product = productResource.read();

  return (
    <div>
      <h2>{product.name}</h2>
      <p>Price: {product.price}</p>
      <p>Description: {product.description}</p>
    </div>
  );
}

function App() {
  const userLocale = getUserLocale(); // Function to determine user's locale
  return (
    <Suspense fallback={<div>Loading product details...</div>}>
      <ProductDetails productId="123" locale={userLocale} />
    </Suspense>
  );
}

Beispiel 2: Globaler Social-Media-Feed

Betrachten Sie eine Social-Media-Plattform, die einen Feed von Beiträgen von Benutzern weltweit anzeigt. Jeder Beitrag kann Text, Bilder und Videos enthalten, deren Laden unterschiedlich lange dauern kann. Suspense kann verwendet werden, um Platzhalter für einzelne Beiträge anzuzeigen, während deren Inhalt geladen wird, was ein flüssigeres Scroll-Erlebnis bietet.

function Post({ postId }) {
  const postResource = fetchData(`/api/posts/${postId}`);
  const post = postResource.read();

  return (
    <div>
      <p>{post.text}</p>
      {post.image && <img src={post.image} alt="Post Image" />}
      {post.video && <video src={post.video} controls />}
    </div>
  );
}

function App() {
  const postIds = getPostIds(); // Function to retrieve a list of post IDs
  return (
    <div>
      {postIds.map(postId => (
        <Suspense key={postId} fallback={<div>Loading post...</div>}>
          <Post postId={postId} />
        </Suspense>
      ))}
    </div>
  );
}

Fazit

React Suspense ist ein leistungsstarkes Werkzeug zur Verwaltung des asynchronen Datenabrufs in React-Anwendungen. Indem Sie die verschiedenen Datenabrufstrategien und Best Practices verstehen, können Sie reaktionsschnelle, benutzerfreundliche und performante Anwendungen erstellen, die ein großartiges Benutzererlebnis bieten. Experimentieren Sie mit verschiedenen Strategien und Bibliotheken, um den besten Ansatz für Ihre spezifischen Anforderungen zu finden.

Während sich React weiterentwickelt, wird Suspense wahrscheinlich eine noch wichtigere Rolle beim Datenabruf und Rendering spielen. Wenn Sie über die neuesten Entwicklungen und Best Practices auf dem Laufenden bleiben, können Sie das volle Potenzial dieser Funktion nutzen.