В этой статье объясняются действия сервера и способы их использования. Действия сервера, альфа-функция в Next.js, построены поверх действий React. Он предоставляет возможность для изменения данных на стороне сервера, сокращения JavaScript на стороне клиента и постепенного улучшения форм.

Включение действий сервера

Чтобы включить действия сервера в вашем проекте Next.js, вам необходимо включить экспериментальный файл. serverActions в файле next.config.js.

const nextConfig = {
  experimental: {
    serverActions: true,
  },
};

Создание действий сервера

Действия сервера создаются путем определения асинхронной функции с директивой "use server" в верхней части тела функции. Эти функции должны иметь сериализуемые аргументы и сериализуемое возвращаемое значение на основе протокола React Server Components.

async function myNewAction() {
  "use server";
  ...
}

Вы также можете использовать директиву "use server" верхнего уровня поверх файла, что полезно, если у вас есть один файл, который экспортирует несколько действий сервера, или если вы импортируете действие сервера в клиентский компонент.

"use server";
 
export async function myAction() {
 ...
}

Вызов действий сервера

Существует три метода вызова действий сервера.

1. действие: используйте свойство действия React, чтобы вызвать действие сервера для элемента ‹form›.

export default function AddToCart({ productId }) {
  async function addItem(data) {
    'use server';
 
    const cartId = cookies().get('cartId')?.value;
    await saveToDb({ cartId, data });
  }
 
  return (
    <form action={addItem}>
      <button type="submit">Add to Cart</button>
    </form>
  );
}

2. formAction: используйте свойство React formAction для обработки таких элементов, как ‹button›, ‹input type="submit"› и ‹input type="image"› в ‹form›.

export default function Form() {
  async function handleSubmit() {
    "use server";
    ...
  }
 
  async function submitImage() {
    "use server";
    ...
  }
 
  return (
    <form action={handleSubmit}>
      <input type="text" name="name" />
      <input type="image" formAction={submitImage} />
      <button type="submit">Submit</button>
    </form>
  );
}

3. Пользовательский вызов с помощью startTransition: вызов действий сервера без использования действия или formAction с помощью startTransition. Этот метод отключает прогрессивное улучшение.

app/_components/client-component.js

'use client';
 
import { useTransition } from 'react';
import { addItem } from '../_actions';
 
function ClientComponent({ id }) {
  let [isPending, startTransition] = useTransition();
 
  return <div onClick={() => startTransition(addItem(id))}>Add To Cart</div>;
}




app/_actions.js

'use server';
 
async function addItem(id) {
  await addItemToDb(id);
  revalidatePath(`/product/${id}`);
}

4. Пользовательский вызов без startTransition: Если вы не выполняете мутации сервера, вы можете напрямую передать функцию как реквизит, как и любую другую функцию.

app/posts/[id]/page.js

import LikeButton from './like-button';
 
export default function Page({ params }) {
  async function increment() {
    'use server';
    await updatingDatabase(`post:id:${params.id}`);
  }
 
  return <LikeButton increment={increment} />;
}
app/post/[id]/like-button.jsx

'use client';
 
export default function LikeButton({ increment }) {
  return (
    <button
      onClick={async () => {
        await increment();
      }}
    >
      Like
    </button>
  );
}

Действия сервера в Next.js предоставляют мощный способ обработки мутаций данных на стороне сервера, сокращения количества JavaScript на стороне клиента и постепенного улучшения форм. Понимая и используя действия сервера, вы можете создавать более эффективные и интерактивные веб-приложения.

Если вам нравятся мои работы и вы хотите купить мне кофе