Next.js v15 - 服務器操作以及調用原理

約定

服務器操作是在服務器上執行的異步函數。它們可以在服務器組件和客戶端組件中調用,用于處理 Next.js 應用程序中的表單提交和數據修改。

服務器操作可以通過 React 的 “use server” 指令定義。你可以將該指令放在 async 函數的頂部以將該函數標記為服務器操作,或者放在單獨文件的頂部以將該文件的所有導出標記為服務器操作。

export default function Page() {// 服務器操作async function create() {'use server'// 修改數據}return '...'
}
'use server'export async function create() {}

應用

React 擴展了 HTML 元素,允許通過 action 屬性調用服務器操作。

export default function Page() {async function createInvoice(formData: FormData) {'use server'const rawFormData = {customerId: formData.get('customerId'),amount: formData.get('amount'),status: formData.get('status'),}// 修改數據// 重新驗證緩存}return <form action={createInvoice}>...</form>
}

通常,Next.js TypeScript 插件會標記updateItemAction,因為函數通常不能在客戶端-服務器邊界之間序列化,序列化是指將對象轉換為可以存儲或傳輸的格式。函數包含上下文和狀態信息,無法簡單地轉化為可以在不同環境中執行的格式。

然而,名為 action 或以 Action 結尾的 props 被假定為接收服務器操作。 這只是一個啟發式方法,因為 TypeScript 插件實際上并不知道它接收的是服務器操作還是普通函數。 運行時類型檢查仍然會確保你不會意外地將函數傳遞給客戶端組件。
處理表單時你可以將服務器操作與useActionState結合使用

export default function Page() {
const initialState: State = { message: null, errors: {} };const [state, formAction] = useActionState(createInvoice, initialState);async function createInvoice(prevState: State, formData: FormData) {'use server'const rawFormData = {customerId: formData.get('customerId'),amount: formData.get('amount'),status: formData.get('status'),}// 修改數據// 重新驗證緩存}return <form action={formAction}>...</form>
}

傳遞另外參數
在這里插入圖片描述
服務器操作將接收 userId 參數,以及表單數據:

'use server'export async function updateUser(userId, formData) {}

程序化表單提交
你可以使用 requestSubmit() 方法以編程方式觸發表單提交。例如,當用戶使用 ? + Enter 鍵盤快捷鍵提交表單時,你可以監聽 onKeyDown 事件

'use client'export function Entry() {const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {if ((e.ctrlKey || e.metaKey) &&(e.key === 'Enter' || e.key === 'NumpadEnter')) {e.preventDefault()e.currentTarget.form?.requestSubmit()}}return (<div><textarea name="entry" rows={20} required onKeyDown={handleKeyDown} /></div>)
}

原理

每當你將 ‘use server’ 添加到服務器端函數并將其導入到客戶端組件時,它都會將其標記為對客戶端可用(服務器的入口點)。這并不意味著函數會被序列化并通過網絡發送,相反,客戶端將獲得該函數的 URL 字符串,客戶端可以使用它通過 RPC 向服務器發送請求。這是一個 POST 請求。這是自動為你處理的,你所要做的就是包含 ‘use server’,導入你的 server action 或將其作為 prop 傳遞,然后就使用它。您永遠不會看到此 URL 字符串,但這就是它在后臺的工作方式。

即使您在 server 組件中使用 server 操作,添加 “use server” 也很重要。假設您在服務器組件中有一個按鈕,并且您希望在有人單擊該按鈕時使用服務器操作。您仍然需要一個 URL 字符串,因為該按鈕最終會出現在客戶端上,并點擊該按鈕。因此,只有當你在 server 操作中包含 “use server” 指令時,它才會起作用。

此外,如果你將服務器操作導入到客戶端組件中,但忘記添加 “use server”,它會將該函數作為代碼導入到客戶端中。它將不再是服務器端功能。當你添加 “use server” 時,它會讓該函數保留在服務器上。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/63690.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/63690.shtml
英文地址,請注明出處:http://en.pswp.cn/web/63690.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

什么是3DEXPERIENCE SOLIDWORKS,它有哪些角色和功能?

將業界領先的 SOLIDWORKS 3D CAD 解決方案連接到基于單一云端產品開發環境 3DEXPERIENCE 平臺。您的團隊、數據和流程全部連接到一個平臺進行高效的協作工作&#xff0c;從而能快速的做出更好的決策。 目 錄&#xff1a; ★ 1 什么是3DEXPERIENCE SOLIDWORKS ★ 2 3DEXPERIE…

【華為OD-E卷-開心消消樂 100分(python、java、c++、js、c)】

【華為OD-E卷-開心消消樂 100分&#xff08;python、java、c、js、c&#xff09;】 題目 給定一個 N 行 M 列的二維矩陣&#xff0c;矩陣中每個位置的數字取值為 0 或 1。矩陣示例如&#xff1a; 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 現需要將矩陣中所有的 1 進行反轉為 0&#…

[Unity]【圖形渲染】【游戲開發】Shader數學基礎4-更多矢量運算

在計算機圖形學和著色器編程中,矢量運算是核心的數學工具之一。矢量用于描述空間中的位置、方向、速度等各種物理量,并在圖形變換、光照計算、紋理映射等方面起著至關重要的作用。本篇文章將詳細講解矢量和標量之間的乘法與除法、矢量的加法與減法、矢量的模與單位矢量、點積…

【漏洞復現】CVE-2023-37461 Arbitrary File Writing

漏洞信息 NVD - cve-2023-37461 Metersphere is an opensource testing framework. Files uploaded to Metersphere may define a belongType value with a relative path like ../../../../ which may cause metersphere to attempt to overwrite an existing file in the d…

Bcrypt在線密碼加密生成器

具體前往&#xff1a;在線Bcrypt加密工具--使用bcrypt及生成salt的迭代次數強度參數計算生成哈希(摘要)

Django 模板分割及多語言支持案例【需求文檔】-->【實現方案】

Django 模板分割及多語言支持案例 這個案例旨在提供一個清晰的示范&#xff0c;展示如何將復雜的頁面分解為多個可復用的模板組件&#xff0c;使代碼更加模塊化和易于管理。希望這篇案例文章對你有所幫助。 概述 在 Django 項目開發中&#xff0c;使用模板分割和多語言支持能…

wxWidgets使用wxStyledTextCtrl(Scintilla編輯器)的正確姿勢

開發CuteMySQL/CuteSqlite開源客戶端的時候&#xff0c;需要使用Scintilla編輯器&#xff0c;來高亮顯示SQL語句&#xff0c;作為C/C領域最成熟穩定又小巧的開源編輯器&#xff0c;Scintilla提供了強大的功能&#xff0c;wxWidgets對Scintilla進行包裝后的是控件類&#xff1a;…

構建高性能異步任務引擎:FastAPI + Celery + Redis

在現代應用開發中&#xff0c;異步任務處理是一個常見的需求。無論是數據處理、圖像生成&#xff0c;還是復雜的計算任務&#xff0c;異步執行都能顯著提升系統的響應速度和吞吐量。今天&#xff0c;我們將通過一個實際項目&#xff0c;探索如何使用 FastAPI、Celery 和 Redis …

介紹 Html 和 Html 5 的關系與區別

HTML&#xff08;HyperText Markup Language&#xff09;是構建網頁的標準標記語言&#xff0c;而 HTML5 是 HTML 的最新版本&#xff0c;包含了一些新的功能、元素、API 和屬性。HTML5 相對于早期版本的 HTML&#xff08;比如 HTML4&#xff09;有許多重要的改進和變化。以下是…

【win10+RAGFlow+Ollama】搭建本地大模型助手(教程+源碼)

一、RAGFlow簡介 RAGFlow是一個基于對文檔深入理解的開源RAG&#xff08;Retrieval-augmented Generation&#xff0c;檢索增強生成&#xff09;引擎。 主要作用&#xff1a; 讓用戶創建自有知識庫&#xff0c;根據設定的參數對知識庫中的文件進行切塊處理&#xff0c;用戶向大…

qwt 之 QwtPlotPicker

QwtPlotMarker 和 QwtPlotPicker 是 Qwt 庫中用于增強 QwtPlot 功能的兩個重要類。它們分別用于在圖中添加標記和實現交互式的選擇或拖動功能。 QwtPlotPicker 提供了交互式的選擇工具&#xff0c;它允許用戶通過鼠標點擊或拖動來選擇圖表中的數據點或區域。這對于實現縮放、平…

C/C++圣誕樹

系列文章 序號直達鏈接1C/C愛心代碼2C/C跳動的愛心3C/C李峋同款跳動的愛心代碼4C/C滿屏飄字表白代碼5C/C大雪紛飛代碼6C/C煙花代碼7C/C黑客帝國同款字母雨8C/C櫻花樹代碼9C/C奧特曼代碼10C/C精美圣誕樹11C/C俄羅斯方塊12C/C貪吃蛇13C/C孤單又燦爛的神-鬼怪14C/C閃爍的愛心15C…

lua dofile 傳參數

cat 1.lua arg[1] 111 arg[2] 222 dofile(./2.lua) cat 2.lua print("First argument is: " .. arg[1]) print("Second argument is: " .. arg[2]) 執行 lua 1.lua&#xff0c;結果為&#xff1a; First argument is: 111 Second argument is: 222 l…

電商數據流通的未來:API接口的智能化與自動化趨勢

在數字化時代&#xff0c;電子商務行業正在以前所未有的速度發展&#xff0c;而API&#xff08;應用程序編程接口&#xff09;接口作為電商領域的重要組成部分&#xff0c;其應用和發展趨勢也日益受到關注。API接口作為電商系統與外部服務或平臺交互的橋梁&#xff0c;對電商數…

投標心態:如何在“標海戰術”中保持清醒的頭腦?

在競爭激烈的市場環境下&#xff0c;“標海戰術”——即大規模參與投標——已經成為許多企業爭取市場份額的重要策略。然而&#xff0c;盲目追求投標數量可能導致資源浪費、團隊疲勞以及戰略目標的模糊化。在這種高強度的競爭模式中&#xff0c;如何保持清醒的頭腦&#xff0c;…

【蒼穹外賣】學習心得體會-隨筆

前言 寫了很久&#xff0c;終于可以完整運行項目了&#xff0c;記錄下這幾天的心得體會回顧一下知識點 第一天、Git 分布式版本控制工具 一、Git概述 定義&#xff1a;是分布式版本控制工具&#xff0c;用于管理軟件開發中的源代碼文件&#xff0c;像Java類、xml文件、html…

windows C#-使用構造函數

實例化類或結構時&#xff0c;將會調用其構造函數。 構造函數與該類或結構具有相同名稱&#xff0c;并且通常初始化新對象的數據成員。 在下面的示例中&#xff0c;通過使用簡單構造函數定義了一個名為 Taxi 的類。 然后使用 new 運算符對該類進行實例化。 在為新對象分配內存…

研發效能DevOps: Vite 使用 Element Plus

目錄 一、實驗 1.環境 2.初始化前端項目 3.安裝 vue-route 4.安裝 pinia 5.安裝 axios 6.安裝 Element Plus 7.gitee創建工程 8. 配置路由映射 9.Vite 使用 Element Plus 二、問題 1.README.md 文檔推送到gitee未自動換行 2.訪問login頁面顯示空白 3.表單輸入賬戶…

5G 模組 RG500Q常用AT命令

5G 模組 RG500Q常用AT命令 5G 模組 RG500Q常用AT命令 at ATQNWPREFCFG\"mode_pref\",nr5g && sleep 1 at ATQNWPREFCFG\"nr5g_band\",79 && sleep 1 at atqnwlock\"commo…

NVIDIA DeepStream插件之Gst-nvtracker

NVIDIA DeepStream插件之Gst-nvtracker 1. 源由2. 基礎知識3. Gst-nvtracker插件3.1 插件參數3.2 插件API接口 4. 分析問題5. 總結6. 參考資料 1. 源由 這篇的主要目的是稍微吐槽下NVIDIA的設計&#xff0c;當然其實他們做的還是不錯的&#xff08;從系統架構設計角度看&#…