AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁 > 科技  > 軟件

React 支持 Form Action 是在作妖?不,它是一種重磅回歸

來源: 責(zé)編: 時間:2024-07-12 17:24:31 144觀看
導(dǎo)讀這是一個超強的特性。仔細看完你就能體會。在 html 的基礎(chǔ)知識中,表單是很重要的一個環(huán)節(jié)。但是由于各種原因,原生的表單開發(fā)方式相關(guān)知識被部分前端開發(fā)所遺忘,他們對 form action,formdata 有一種陌生感。因此,當(dāng)看到有

BHl28資訊網(wǎng)——每日最新資訊28at.com

這是一個超強的特性。仔細看完你就能體會。BHl28資訊網(wǎng)——每日最新資訊28at.com

在 html 的基礎(chǔ)知識中,表單是很重要的一個環(huán)節(jié)。但是由于各種原因,原生的表單開發(fā)方式相關(guān)知識被部分前端開發(fā)所遺忘,他們對 form action,formdata 有一種陌生感。BHl28資訊網(wǎng)——每日最新資訊28at.com

因此,當(dāng)看到有消息稱 React 19 支持了 form action 之后,許多前端感覺有點懵。不知道這是啥。這篇文章就先給大家科普一下相關(guān)的知識。BHl28資訊網(wǎng)——每日最新資訊28at.com

一、HTML form action

先來看一段簡單的代碼。BHl28資訊網(wǎng)——每日最新資訊28at.com

<form id="form" method="get">  First name:  <input type="text" value="Jake" name="fname">  Last name:  <input type="text" value="Ma" name="lname">  <input type="submit" value="提交"></form>

當(dāng)我們使用表單 form 元素時,內(nèi)部的表單元素可以根據(jù) name 屬性與 value 值自動組合成一個完整的序列化表單對象。我們不再需要額外去拼接他們。BHl28資訊網(wǎng)——每日最新資訊28at.com

合成的序列化對象,我們稱之為 FormData, 這是一個特殊的對象。我們可以直接通過如下方式獲取到該對象。BHl28資訊網(wǎng)——每日最新資訊28at.com

let formdata = new FormData(form)console.log(formdata.get('fname'))console.log(formdata.get('lname'))

iBHl28資訊網(wǎng)——每日最新資訊28at.com

我們無法直接觀察到 FormData 的值,需要使用 .get 方法來獲取。BHl28資訊網(wǎng)——每日最新資訊28at.com

FormData 也可以被網(wǎng)絡(luò)請求支持,例如我們可以把 FormData 對象作為 fetch 請求的 body,直接發(fā)送。BHl28資訊網(wǎng)——每日最新資訊28at.com

form.onsubmit = async e => {  e.preventDefault()    const response = await fetch('/post/user', {    method: 'POST',    body: new FormData(form)  })  let res = await response.json()  // do something}

在這個案例中,當(dāng) type='submit' 的按鈕點擊提交時,onsubmit 就會觸發(fā),我們可以在這個回調(diào)函數(shù)里執(zhí)行自己的提交邏輯。BHl28資訊網(wǎng)——每日最新資訊28at.com

?BHl28資訊網(wǎng)——每日最新資訊28at.com

HTTP 中 content-type 字段有專門支持 FormData 的值,如下所示:BHl28資訊網(wǎng)——每日最新資訊28at.com

Content-Type: multipart/form-data

除此之外,我們可以使用 form 元素的 action 屬性來簡化提交。不過它的表現(xiàn)會不太一樣。BHl28資訊網(wǎng)——每日最新資訊28at.com

action 接收一個 URL 作為參數(shù),可以是絕對路徑,也是可以相對路徑。它表示攜帶表單數(shù)據(jù)向該地址發(fā)送請求。默認情況下頁面會跳轉(zhuǎn)到指定的 URL 地址。BHl28資訊網(wǎng)——每日最新資訊28at.com

<form id="form" action="xx.html" method="post">  First name:  <input type="text" value="Jake" name="fname">  Last name:  <input type="text" value="Ma" name="lname">  <input type="submit" value="提交"></form>

服務(wù)端可以攔截該地址,并定義響應(yīng)行為。BHl28資訊網(wǎng)——每日最新資訊28at.com

這樣做的好處就是我們可以簡化提交行為的代碼。無需使用 JavaScript 對邏輯進行任何額外的處理,就能完成一次提交操作。在沒有額外要求的情況下,我們可以非常方便的使用這種方式來提交表單數(shù)據(jù),上傳文件等。BHl28資訊網(wǎng)——每日最新資訊28at.com

二、FormData 使用詳解

FormData API 如下圖所示。BHl28資訊網(wǎng)——每日最新資訊28at.com

BHl28資訊網(wǎng)——每日最新資訊28at.com

四、案例

學(xué)習(xí)了這些基礎(chǔ)知識之后,我們來完成一個比較簡單的案例。我們在表單中輸入信息,并把信息記錄展示在一個列表中。案例演示效果如下BHl28資訊網(wǎng)——每日最新資訊28at.com

BHl28資訊網(wǎng)——每日最新資訊28at.com

首先我們要定義一個數(shù)據(jù),用于存儲列表。BHl28資訊網(wǎng)——每日最新資訊28at.com

const [posts, setPosts] = useState([])

然后在 jsx 中,定義一個表單內(nèi)容,和列表渲染。BHl28資訊網(wǎng)——每日最新資訊28at.com

<div>  <div>基礎(chǔ)的表單提交案例</div>  <form action={action}>    <div className="form_item">      <div className="label">Title</div>      <input name='title' type="text" placeholder='Enter title' />    </div>    <div className="form_item">      <div className="label">Name</div>      <input name='content' type="text" placeholder='Enter you name' />    </div>    <div className="form_item">      <button className='primary' type='submit'>Submit</button>    </div>  </form>  <ul className='_07_list'>    {posts.map((post, index) => (      <div key={`${post.title}-${index}`} className='_07_item'>        <h2>{post.title}</h2>        <p>{post.content}</p>      </div>    ))}  </ul></div>

提交之后的邏輯在 action 中處理,action 回調(diào)函數(shù)能拿到最新的 formdata。然后把對應(yīng)的數(shù)據(jù)拿出來,設(shè)置到 posts 里面即可。BHl28資訊網(wǎng)——每日最新資訊28at.com

function action(data) {  const title = data.get('title')  const content = data.get('content')  if (title && content) {    setPosts([...posts, {title, content}])  }}

我們可以簡單擴展一下,在這個基礎(chǔ)之上做一些校驗。我們把其中一個 input 做一些簡單的調(diào)整。BHl28資訊網(wǎng)——每日最新資訊28at.com

<input  onInput={onInput}  name='content'  type="text"  placeholder='Enter you name'  required  pattern={'abc'}/>

在 css 中,新增如果校驗不通過的樣式。BHl28資訊網(wǎng)——每日最新資訊28at.com

input:invalid {  border: 1px dashed red;}

演示效果如下:BHl28資訊網(wǎng)——每日最新資訊28at.com

BHl28資訊網(wǎng)——每日最新資訊28at.com

我們還可以通過 input 的 onInput 事件對驗證樣式進行自定義。BHl28資訊網(wǎng)——每日最新資訊28at.com

function onInput(event) {  let input = event.target  console.log(input.validity)  if (input.validity.valid) {    console.log('xxxxx', input.validity)  }}

BHl28資訊網(wǎng)——每日最新資訊28at.com

這里面有許多狀態(tài)可以支持我們做許多自己的擴展。BHl28資訊網(wǎng)——每日最新資訊28at.com

五、它對服務(wù)端渲染的劃時代意義

這里大家需要注意的一個小細節(jié)就是,許多針對表單功能增強的 API,都不是從 react 中引入,而是從 react-dom 中引入。BHl28資訊網(wǎng)——每日最新資訊28at.com

BHl28資訊網(wǎng)——每日最新資訊28at.com

第一時間我還沒想通這到底咋回事。感覺好奇怪。后來我才意識到,這對于服務(wù)端渲染有著巨大的劃時代的重要意義。BHl28資訊網(wǎng)——每日最新資訊28at.com

在評估網(wǎng)頁性能中,有一個重要的性能指標:TTI:可交互時間。頁面加載完成,并且首屏顯示,并且頁面可以交互。BHl28資訊網(wǎng)——每日最新資訊28at.com

但是,在以前的服務(wù)端渲染項目中,想要頁面元素可以被點擊,可交互,需要經(jīng)歷一個重要的過程,那就是 Hydrate 水合。意思就是說,第一時間從服務(wù)端給到頁面上的只是字符串,并不具備可交互功能,它需要瀏覽器渲染之后,變成 DOM 元素,再通過 React 水合之后,再變成 React 組件,然后才可以正常點擊交互。BHl28資訊網(wǎng)——每日最新資訊28at.com

因此,React 服務(wù)端渲染項目雖然首屏直出理論上會快一些,但是 TTI 要多經(jīng)歷一個水合的過程,那么可交互時間等待就比較久了。BHl28資訊網(wǎng)——每日最新資訊28at.com

?BHl28資訊網(wǎng)——每日最新資訊28at.com

其實也不一定,處理不好,服務(wù)端渲染項目也會更慢。BHl28資訊網(wǎng)——每日最新資訊28at.com

React 19 支持的 form action,實際上是極大的利用了瀏覽器的自帶的表單能力,它要可交互,并不需要經(jīng)歷水合過程,瀏覽器渲染成 DOM 就可以正常交互了。BHl28資訊網(wǎng)——每日最新資訊28at.com

道友們,誰懂啊,這就有點厲害了。BHl28資訊網(wǎng)——每日最新資訊28at.com

?BHl28資訊網(wǎng)——每日最新資訊28at.com

有的服務(wù)端渲染項目首屏渲染時間只需要不到 1s,但是首次可交互時間,能長達 8s 之久。從這個簡單的數(shù)據(jù)對比,你就能領(lǐng)會不需要水合是多大的提升了。BHl28資訊網(wǎng)——每日最新資訊28at.com

這不僅在客戶端組件中,直接掙脫了之前受控組件在性能上的桎梏,還更進一步在服務(wù)端渲染項目有更強的體現(xiàn)。如果一旦跟 next.js 有機結(jié)合...BHl28資訊網(wǎng)——每日最新資訊28at.com

不得不佩服 React 團隊在設(shè)計項目架構(gòu)解決方案上的超前思維。BHl28資訊網(wǎng)——每日最新資訊28at.com

六、總結(jié)

React form Action 是一個很小的知識點,但是它代表的是表單開發(fā)的另一種思路,是一種開發(fā)方式的隆重回歸。因此這要求我們對 HTML 本身已經(jīng)支持的表單能力要有所了解。我們在后續(xù)的開發(fā)使用中,會逐漸弱化受控組件的使用,這會帶來開發(fā)體驗和性能上的提升。BHl28資訊網(wǎng)——每日最新資訊28at.com

除此之外,React 在表單開發(fā)中還提供了許多功能增強的 hook,我們在后續(xù)的分享慢慢學(xué)習(xí)。BHl28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-100724-0.htmlReact 支持 Form Action 是在作妖?不,它是一種重磅回歸

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 電商并發(fā)減庫存設(shè)計,如何做到不超賣

下一篇: 記一次 .NET某上位視覺程序離奇崩潰分析

標簽:
  • 熱門焦點
  • K60 Pro官方停產(chǎn) 第三方瞬間漲價

    雖然沒有官方宣布,但Redmi的一些高管也已經(jīng)透露了,Redmi K60 Pro已經(jīng)停產(chǎn)且不會補貨,這一切都是為了即將到來的K60 Ultra鋪路,屬于廠家的正常操作。但有意思的是該機在停產(chǎn)之后
  • K60至尊版剛預(yù)熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛?cè)缁鹑巛钡男麄髁薑60 Ultra的各種技術(shù)和硬件配置,作為競品的一加也坐不住了。一加中國區(qū)總裁李杰發(fā)布了兩條微博,表示在自家的一加Ace2上早就已經(jīng)采用了和PixelWo
  • 一文看懂為蘋果Vision Pro開發(fā)應(yīng)用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現(xiàn)實(MR)頭戴設(shè)備。Vision Pro結(jié)合了虛擬現(xiàn)實(VR)和增強現(xiàn)實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • 三言兩語說透設(shè)計模式的藝術(shù)-單例模式

    寫在前面單例模式是一種常用的軟件設(shè)計模式,它所創(chuàng)建的對象只有一個實例,且該實例易于被外界訪問。單例對象由于只有一個實例,所以它可以方便地被系統(tǒng)中的其他對象共享,從而減少
  • 騰訊蓋樓,字節(jié)拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 三星電子Q2營收60萬億韓元 存儲業(yè)務(wù)營收同比仍下滑超過50%

    7月27日消息,據(jù)外媒報道,從三星電子所發(fā)布的財報來看,他們主要利潤來源的存儲芯片業(yè)務(wù)在今年二季度仍不樂觀,營收同比仍在大幅下滑,所在的設(shè)備解決方案
  • iQOO Neo8 Pro評測:旗艦雙芯加持 最強性能游戲旗艦

    【Techweb評測】去年10月,iQOO推出了一款Neo7手機,該機搭載了聯(lián)發(fā)科天璣9000+,配備獨顯芯片Pro+,帶來了同價位段最佳的游戲體驗,一經(jīng)上市便受到了諸多用
  • iQOO Neo8 Pro搶先上架:首發(fā)天璣9200+ 安卓性能之王

    經(jīng)過了一段時間的密集爆料,昨日iQOO官方如期對外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級性能調(diào)校的作品。隨著發(fā)布時
  • SN570 NVMe SSD固態(tài)硬盤 價格與性能兼具

    SN570 NVMe SSD固態(tài)硬盤是西部數(shù)據(jù)發(fā)布的最新一代WD Blue系列的固態(tài)硬盤,不僅閃存技術(shù)更為精進,性能也得到了進一步的躍升。WD Blue SN570 NVMe SSD的包裝外
Top