'use server'
React Server Components
'use server' используется с использованием React Server Components.
'use server' отмечает функции на стороне сервера, которые могут вызываться кодом на стороне клиента.
Справочник
'use server'
Добавьте 'use server' в начале тела асинхронной функции, чтобы отметить функцию как вызываемую клиентом. Мы называем эти функции Функциями сервера.
async function addToCart(data) {
'use server';
// ...
} При вызове функции сервера на клиенте будет отправлен сетевой запрос на сервер, включающий сериализованную копию любых переданных аргументов. Если функция сервера возвращает значение, это значение будет сериализовано и возвращено клиенту.
Вместо отдельной маркировки функций с 'use server', вы можете добавить директиву в начало файла, чтобы отметить все экспорты в этом файле как функции сервера, которые можно использовать в любом месте, включая импорт в клиентский код.
Ограничения
-
'use server'должны быть в самом начале функции или модуля; выше любого другого кода, включая импорты (комментарии выше директив допустимы). Они должны быть написаны с одинарными или двойными кавычками, а не обратными апострофами. -
'use server'могут использоваться только в файлах на стороне сервера. Результирующие функции сервера могут передаваться клиентским компонентам через свойства. Смотрите поддерживаемые типы для сериализации. - Для импорта функций сервера из клиентского кода, директива должна использоваться на уровне модуля.
- Поскольку основанные сетевые вызовы всегда асинхронны,
'use server'может использоваться только с асинхронными функциями. - Всегда рассматривайте аргументы функций сервера как ненадёжные входные данные и авторизуйте любые изменения. Смотрите учёт мер безопасности.
- Функции сервера должны вызываться в Transition. Функции сервера, переданные в
<form action>илиformAction, автоматически будут вызваны в рамках транзакции. - Функции сервера предназначены для изменений, обновляющих состояние на стороне сервера; они не рекомендуются для получения данных. Соответственно, фреймворки, реализующие функции сервера, обычно обрабатывают одно действие за раз и не имеют способа кэширования возвращаемого значения.
Учёт мер безопасности
Аргументы функций сервера полностью контролируются клиентом. Для обеспечения безопасности всегда рассматривайте их как ненадёжные входные данные и убедитесь, что аргументы валидированы и экранированы должным образом.
В любой функции сервера убедитесь, что вошедший пользователь имеет право выполнить это действие.
В разработке
Для предотвращения отправки конфиденциальных данных из функции сервера существуют экспериментальные API для предотвращения передачи уникальных значений и объектов в клиентский код.
См. experimental_taintUniqueValue и experimental_taintObjectReference.
Сериализуемые аргументы и возвращаемые значения
Поскольку клиентский код вызывает функцию сервера через сеть, все передаваемые аргументы должны быть сериализуемыми.
Вот поддерживаемые типы аргументов для функций сервера:
- Примитивы
- строка
- число
- bigint
- булево
- неопределено
- null
-
символ, только символы, зарегистрированные в глобальной базе символов Symbol через
Symbol.for
- Итерируемые объекты, содержащие сериализуемые значения
- Дата
- FormData
- Простые объекты: созданные с помощью инициализаторов объектов, с сериализуемыми свойствами
- Функции, являющиеся функциями сервера
- Promises
Следующие типы не поддерживаются:
- Элементы React или JSX
- Функции, включая функции компонентов или любые другие функции, которые не являются функциями сервера
- Классы
- Объекты, которые являются экземплярами любого класса (кроме встроенных), или объекты с null прототипом
- Символы, не зарегистрированные глобально, например
Symbol('my new symbol') - События из обработчиков событий
Поддерживаемые сериализуемые возвращаемые значения идентичны сериализуемым свойствам для граничного клиентского компонента.
Использование
Функции сервера в формах
Наиболее распространённый случай использования функций сервера — вызов функций, изменяющих данные. В браузере элемент формы HTML традиционно используется для отправки пользователем мутации. В React Server Components React вводит первоклассную поддержку функций сервера в качестве действий в формах .
Вот форма, которая позволяет пользователю запросить имя пользователя.
// App.js
async function requestUsername(formData) {
'use server';
const username = formData.get('username');
// ...
}
export default function App() {
return (
<form action={requestUsername}>
<input type="text" name="username" />
<button type="submit">Request</button>
</form>
);
} В этом примере requestUsername — функция сервера, переданная в <form>. Когда пользователь отправляет эту форму, происходит сетевой запрос к функции сервера requestUsername. При вызове функции сервера в форме React предоставляет форму FormData в качестве первого аргумента функции сервера.
Передавая функцию сервера в форму action, React может постепенно улучшать форму. Это означает, что формы можно отправлять до загрузки JavaScript-пакета.
Обработка возвращаемых значений в формах
В форме запроса имени пользователя может возникнуть случай, когда имя пользователя недоступно. requestUsername должен сообщить об успехе или неудаче.
Для обновления пользовательского интерфейса на основе результата функции сервера с поддержкой постепенного улучшения используйте useActionState.
// requestUsername.js
'use server';
export default async function requestUsername(formData) {
const username = formData.get('username');
if (canRequest(username)) {
// ...
return 'successful';
}
return 'failed';
} // UsernameForm.js
'use client';
import { useActionState } from 'react';
import requestUsername from './requestUsername';
function UsernameForm() {
const [state, action] = useActionState(requestUsername, null, 'n/a');
return (
<>
<form action={action}>
<input type="text" name="username" />
<button type="submit">Request</button>
</form>
<p>Last submission request returned: {state}</p>
</>
);
} Обратите внимание, что, как и большинство хуков, useActionState может быть вызван только в клиентском коде.
Вызов функции сервера вне <form>
Функции сервера предоставляются как серверные точки доступа и могут вызываться в любом месте клиентского кода.
При использовании функции сервера вне формы форма, вызовите функцию сервера в Transition, что позволяет отображать индикатор загрузки, показывать оптимистические обновления состояния и обрабатывать непредвиденные ошибки. Формы автоматически оборачивают функции сервера в переходы.
import incrementLike from './actions';
import { useState, useTransition } from 'react';
function LikeButton() {
const [isPending, startTransition] = useTransition();
const [likeCount, setLikeCount] = useState(0);
const onClick = () => {
startTransition(async () => {
const currentCount = await incrementLike();
setLikeCount(currentCount);
});
};
return (
<>
<p>Total Likes: {likeCount}</p>
<button onClick={onClick} disabled={isPending}>Like</button>;
</>
);
} // actions.js
'use server';
let likeCount = 0;
export default async function incrementLike() {
likeCount++;
return likeCount;
} Чтобы прочитать возвращаемое значение функции сервера, вам необходимо await вернуть promise.
© 2013–present Facebook Inc.
Licensed under the Creative Commons Attribution 4.0 International Public License.
https://react.dev/reference/rsc/use-server