Maison > interface Web > js tutoriel > le corps du texte

Renvoi de JSX à partir des actions du serveur React

王林
Libérer: 2024-08-31 06:34:37
original
640 Les gens l'ont consulté

Saviez-vous que les actions du serveur Next.js peuvent renvoyer un balisage JSX au lieu de données JSON brutes ?

Bien que ce ne soit pas explicitement mentionné dans la documentation, j'ai été agréablement surpris que cela fonctionne.

Exemple

J'ai une page qui affiche la liste des utilisateurs avec l'action du serveur :

export default function Page() {
  async function loadUsersAction() {
    "use server";

    return [
      { name: "John", age: 30 },
      { name: "Jane", age: 25 },
      { name: "Doe", age: 40 },
    ];
  }

  return <UsersList loadUsersAction={loadUsersAction} />;
}
Copier après la connexion

Le composant UsersList charge les utilisateurs en cliquant sur un bouton :

export default function UsersList({ loadUsersAction }) {
  const [users, setUsers] = useState();

  const onClick = async () => {
    const data = await loadUsersAction();
    setUsers(data);
  };

  return (
    <>
      <button onClick={onClick}>Load users</button>
      <ul>
        {users?.map((user) => (
          <li key={user.name}>
            {user.name} - {user.age}
          </li>
        ))}
      </ul>
    </>
  );
}
Copier après la connexion

Démo :

Returning JSX from React Server Actions

Maintenant, je change l'action du serveur pour renvoyer JSX avec les utilisateurs rendus :

async function loadUsersAction() {
  "use server";

  const users = [
    { name: "John", age: 30 },
    { name: "Jane", age: 25 },
    { name: "Doe", age: 40 },
  ];

  return (
    <ul>
      {users?.map((user) => (
        <li key={user.name}>
          {user.name} - {user.age}
        </li>
      ))}
    </ul>
  );
}
Copier après la connexion

Et dans le composant UsersList, restituez simplement la réponse à l'action du serveur :

export default function UsersList({ loadUsersAction }) {
  const [users, setUsers] = useState();

  const onClick = async () => {
    const data = await loadUsersAction();
    setUsers(data);
  };

  return (
    <>
      <button onClick={onClick}>Load users</button>
      {users}
    </>
  );
}
Copier après la connexion

Dans le navigateur, tout fonctionne de la même manière !

Remarque sur la gestion des erreurs

Et si l'action du serveur génère une erreur ? Lorsqu'il renvoie des données JSON, nous pouvons détecter cette erreur dans l'action et la renvoyer dans notre propre format comme :

{ error: "my error" }
Copier après la connexion

Lors du retour de JSX, nous pouvons laisser l'erreur se déclencher et l'attraper avec la limite d'erreur la plus proche sur le client. Selon la documentation React, les appels d'action du serveur en dehors du

Le composant doit être enveloppé dans Transition pour une gestion appropriée des erreurs.
Le code final du composant UsersList :

export default function UsersList({ loadUsersAction }) {
  const [isPending, startTransition] = useTransition();
  const [users, setUsers] = useState();

  const onClick = () => {
    startTransition(async () => {
      const data = await loadUsersAction();
      setUsers(data);
    });
  };

  return (
    <>
      <button onClick={onClick}>Load users</button>
      {isPending ? <div>Loading users...</div> : users}
    </>
  );
}
Copier après la connexion

De plus, j'utilise l'indicateur isPending pour afficher le message lors du chargement des utilisateurs.

Démo :
Returning JSX from React Server Actions

J'espère que cela sera utile.
Merci d'avoir lu et bon codage ! ❤️

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal