Я следую примеру useActionState , найденному здесь . Я использую nextjs и машинописный текст.
app/page.tsx:
"use client";
import { useActionState } from "react";
import { createUser } from "../components/actions";
const initialState = {
message: "",
};
export default function App() {
const [state, formAction] = useActionState(createUser, initialState);
return (
<form action = {formAction}>
<label htmlFor = "email">Email</label>
<input type = "text" id = "email" name = "email" required />
{/* ... */}
<p aria-live = "polite" className = "sr-only">
{state?.message}
</p>
<button>Sign up</button>
</form>
);
}
../components/actions.ts:
'use server'
export default async function createUser(prevState: any, formData: FormData) {
return {
message: 'Please enter a valid email',
}
}
Когда я запускаю пример, я получаю:
Error: (0 , react__WEBPACK_IMPORTED_MODULE_1__.useActionState) is not a function or its return value is not iterable
Мой package.json выглядит так:
{
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"db:migrate": "TS_NODE_COMPILER_OPTIONS='{ \"module\": \"commonjs\" }' knex migrate:latest",
"db:migrate:undo": "TS_NODE_COMPILER_OPTIONS='{ \"module\": \"commonjs\" }' knex migrate:down",
"db:migrate:make": "TS_NODE_COMPILER_OPTIONS='{ \"module\": \"commonjs\" }' knex migrate:make"
},
"dependencies": {
"react": "canary",
"react-dom": "canary",
"react-scripts": "^5.0.0"
},
"main": "/index.js",
"devDependencies": {}
}
Мой tsconfig.json:
{
"compilerOptions": {
"target": "es2015",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "Node",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}
Также посмотрите этот ответ: stackoverflow.com/a/78445866/258174
Кажется работает ;). Можете ли вы создать ответ, чтобы я мог его принять?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В Next.js добавлена поддержка функций React 19, в частности useActionState в PR 65058 . В шаблон create-next-app добавлена такая же поддержка в PR 65478. Версии 14.3.0-canary.45 и 14.3.0-canary.46 соответственно.
Таким образом, вы можете получить поддержку useActionState в Next.js, запустив npx [email protected] или любую более позднюю версию.
Вы можете использовать перехват useFormState из пакета реагирования в качестве временного решения вместо перехватчика useActionState из пакета реагирования до тех пор, пока не станет доступно будущее обновление Next.js.
Сначала замените оператор импорта useActionState на useFormState:
// import { useActionState } from 'react';
import { useFormState } from 'react-dom';
Используйте канареечную сборку next. Это определенно есть в v14.3.0-canary.47. Так что вы можете сделать
npx [email protected]. Вот и все.