成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Form 元素是 React 的未來

開發 前端
說到React未來的發展,必須從Next.js聊起。畢竟,React團隊成員不是加入Next團隊,就是在加入的路上。

大家好,我卡頌。

請思考一個問題:如果有一個HTML標簽,React圍繞他專門出了2個hook,那這個標簽對React未來的發展一定非常重要,這沒毛病吧?

這個標簽就是 —— form。

React圍繞form新出了如下2個hook:

  • useOptimistic
  • useFormStatus

本文會聊聊React圍繞form的布局與發展。

Next.js的發展歷程

說到React未來的發展,必須從Next.js聊起。畢竟,React團隊成員不是加入Next團隊,就是在加入的路上。

web開發中涉及到前后端交互的部分主要包括:

  1. 根據后端數據渲染前端頁面
  2. 根據前端用戶輸入保存數據到后端

Next.js的發展主要圍繞以上兩點展開。

根據后端數據渲染前端頁面

前期,Next.js的主打特性是SSR、SSG。也就是把「根據后端數據渲染前端頁面」的過程從前端挪到后端。

這個時期的Next.js路由被稱為Pages Router。

時間來到Next.js v13,以RSC(React Server Component)為核心的App Router取代Pages Router成為默認配置。

圖片

很多朋友不熟悉RSC,認為他是實驗特性。實際上,RSC借由Next.js已經落地了。

一句話理解RSC —— 客戶端組件(在瀏覽器渲染的React組件)可以根據依賴分為兩部分:

  • 依賴數據源(比如數據庫、文件系統)的組件,可以作為RSC(服務端組件)
  • 依賴狀態(比如state、props、context)的組件,可以作為客戶端組件

從「根據后端數據渲染前端頁面」角度看:

  • SSR、SSG是頁面級別的(服務端渲染呈現的是整個頁面)
  • RSC是組件級別的(服務端組件請求數據源)

根據前端用戶輸入保存數據到后端

聊完了「根據后端數據渲染前端頁面」,那么,圍繞「根據前端用戶輸入保存數據到后端」,Next.js能做哪些優化?

這就要提到Next.js的實驗特性 —— Server Action。

Server Action

「根據前端用戶輸入保存數據到后端」的常見場景是「表單提交」,通常我們會在formonSubmit事件中做后續處理:

function Form() {
  function submit() {
    // ...處理formData的邏輯
    // ...發送請求的邏輯
  }
  return (
    <form onSubmit={submit}>
      <input type="text"/>
      <input type="text"/>
    </form>
  )
}

以上代碼有什么可改進的地方呢?

從用戶體驗的角度看,如果前端禁用了JS,那么React不能運行,上述交互失效。如果在禁用JS的情況下也能提交表單就好了。

從開發體驗的角度看,submit方法會發起請求,后端再根據請求攜帶的formData操作數據庫,比較繁瑣。如果在submit方法內能直接操作數據庫就好了。

Server Action特性就是為了實現以上2個目標。

首先來看第一個目標。

目標1

HTML原生的form元素有個action屬性,可以接收一個url。當提交表單(比如點擊type為submit的按鈕)后formData會提交給該url。

<form action="/action_page.php" method="get">
  <label for="fname">First name:</label>
  <input type="text" id="fname" name="fname"><br><br>
  <label for="lname">Last name:</label>
  <input type="text" id="lname" name="lname"><br><br>
  <input type="submit" value="Submit">
</form>

由于「提交表單」的行為是HTML原生支持的,所以在禁用JS的情況下也能執行。

這就是禁用JS也能提交表單的理論基礎。

目標2

React擴展了form的action屬性,讓他除了支持url,還能支持回調函數,比如:

function App() {
  function submit(data) {
    // ...
  }
  return (
    <form action={submit}>
      <! -- 省略 -->
    </form>
  );

如果這個回調函數內是前端執行的邏輯,則被稱為client action,比如下面這樣:

async function submit(data) {
    await const res = saveData(data);
    // ...
  }

如果這個函數內是后端執行的邏輯,則被稱為server action,比如下面這樣:

"use server"
  
  async function submit(data) {
    const userID = cookies().get("userID")?.value;
    await db.users.update(userID, data);
    // ...
  }

"use server"標記代表這是個server action。

如果是server action,那么發起的請求類型是multipart/form-data(即表單提交):

圖片

響應類型則是RSC協議:

圖片

也就是說,有了server action,開發者可以直接在form的action屬性(或者button的formAction屬性等其他幾種屬性)內書寫后端邏輯,并且在瀏覽器禁用JS的情況下這些邏輯也能執行。

2個新hook

為了更好的服務server action,React團隊新出了2個hook用于提高form場景下的用戶體驗:

  • useOptimistic
  • useFormStatus

當前,這2個hook的介紹只能在Next.js文檔[1](而不是React文檔)中看到。

useOptimistic主要用來優化「提交數據」的用戶體驗。

比如,在「點贊」的場景,通常邏輯是:

  1. 點擊點贊按鈕
  2. 發起點贊請求
  3. 點贊成功,前端顯示點贊效果

但為了用戶體驗的流暢,前端通常會把邏輯做成:

  1. 點擊點贊按鈕
  2. 前端顯示點贊效果(同時發起點贊請求)
  3. 根據請求結果,如果點贊成功則不做處理,如果點贊失敗則重置按鈕

useOptimistic的本質就是在狀態層面實現上述效果。

useFormStatus則用于在表單提交過程中顯示pending狀態:

function ButtonDisabledWhilePending({action, children}) {
  const {pending} = useFormStatus();
  return (
    <button disabled={pending} formAction={action}>
      {children}
    </button>
  );
}

有同學可能會疑惑:useFormStatus沒有傳參,他怎么知道對應哪個form?

實際上,為了實現useFormStatus,React在源碼內為所有HostComponent(即原生HTML元素對應組件,比如<div/>)定制了一個context。

當某個form觸發表單提交時,context的值會被更新為這個form的數據。useFormStatus本身僅僅是useContext(上述context)。

總結

可以發現,不管是useFormStatus、useOptimistic還是最近1~2年新出的hook(比如useId、useMutableSource),我們開發者都很少會用到。

因為這些hook都是為上層框架(主要是Next.js)提供的。

React早已完成他作為前端框架的使命。在他生命的后半程,他將作為上層框架的「操作系統」而存在。

server action是Next.js的未來,Next.js是React的未來。所以,React的未來會圍繞form元素持續布局。

參考資料

[1]Next.js文檔:https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions#experimental-useoptimistic。

責任編輯:姜華 來源: 魔術師卡頌
相關推薦

2019-10-16 18:00:44

AngularVueReact

2018-07-30 11:53:04

Kubernetes無服務器容器

2022-10-14 08:45:54

2024-07-12 11:23:59

2022-12-27 08:10:00

2020-03-11 14:44:58

?編碼無碼代碼

2018-07-27 14:17:32

2011-12-09 20:03:05

平板

2022-06-13 06:20:42

setStatereact18

2018-02-26 18:54:37

2013-11-12 09:13:21

開放云

2012-04-11 09:46:40

Web App

2020-09-16 23:00:15

Rust編程語言開發

2021-05-10 12:30:40

智慧農業物聯網IOT

2009-11-18 09:41:32

GoogleChrome OSLinux

2022-08-26 09:35:31

網絡安全零信任工具

2023-06-08 11:31:00

WebGPUWeb 平臺

2023-09-25 10:31:42

汽車行業數字化轉型

2024-02-19 14:23:05

機器學習聯絡中心

2016-01-28 13:44:03

混合云私有云公有云
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 在线视频三区 | 在线观看黄视频 | 黄篇网址 | 成人性生交大片免费看中文带字幕 | 男女视频在线免费观看 | 综合色在线 | 中文天堂在线观看 | 欧美日韩不卡 | 国产一区二区三区精品久久久 | 亚洲国产精品久久久久 | 午夜私人影院在线观看 | 91精品久久久久久久久久入口 | 日日夜夜精品 | 日韩在线观看网站 | 免费观看黄网站 | 日韩中文字幕在线观看 | 亚洲综合天堂 | 日本午夜免费福利视频 | 国产一区二区自拍 | 欧美激情精品久久久久久变态 | 国产美女在线免费观看 | 热99| caoporn免费在线视频 | 妞干网av| 天天综合久久 | 精品成人一区二区 | 羞羞网站免费 | 伊人二区| 日韩成人免费视频 | 国产成人综合一区二区三区 | 毛片网站免费观看 | 久久久久久久一区二区三区 | 欧美成人一区二区三区 | 91精品国产乱码久久久久久久久 | 精品自拍视频在线观看 | 91国内视频在线 | 成人福利电影 | 欧美日韩成人在线 | 久久婷婷香蕉热狠狠综合 | 国产精品国产精品国产专区不蜜 | 超碰8|