ホームページ > 記事 > ウェブフロントエンド > React サーバーから JSX を返すアクション
Next.js サーバー アクションは生の JSON データではなく JSX マークアップを返すことができることをご存知ですか?
ドキュメントには明示的に記載されていませんが、機能することに嬉しい驚きを感じました。
サーバーアクションを使用してユーザーリストをレンダリングするページがあります:
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} />; }
UsersList コンポーネントは、ボタンのクリックによってユーザーを読み込みます:
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> </> ); }
デモ:
次に、レンダリングされたユーザーを含む JSX を返すようにサーバー アクションを変更します。
:
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> ); }
UsersList コンポーネントでは、サーバー アクションの応答をレンダリングするだけです:
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} </> ); }
ブラウザではすべて同じように動作します!
サーバーアクションでエラーがスローされた場合はどうなりますか? JSON データが返されると、アクション内でそのエラーをキャッチし、次のような独自の形式で返すことができます。
{ error: "my error" }
JSX を返すときに、エラーをスローさせ、クライアント上の最も近いエラー境界でキャッチすることができます。 React のドキュメントによると、サーバー アクションは