当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2024-07-12 17:24:31 245观看
导读这是一个超强的特性。仔细看完你就能体会。在 html 的基础知识中,表单是很重要的一个环节。但是由于各种原因,原生的表单开发方式相关知识被部分前端开发所遗忘,他们对 form action,formdata 有一种陌生感。因此,当看到有

w2f28资讯网——每日最新资讯28at.com

这是一个超强的特性。仔细看完你就能体会。w2f28资讯网——每日最新资讯28at.com

在 html 的基础知识中,表单是很重要的一个环节。但是由于各种原因,原生的表单开发方式相关知识被部分前端开发所遗忘,他们对 form action,formdata 有一种陌生感。w2f28资讯网——每日最新资讯28at.com

因此,当看到有消息称 React 19 支持了 form action 之后,许多前端感觉有点懵。不知道这是啥。这篇文章就先给大家科普一下相关的知识。w2f28资讯网——每日最新资讯28at.com

一、HTML form action

先来看一段简单的代码。w2f28资讯网——每日最新资讯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>

当我们使用表单 form 元素时,内部的表单元素可以根据 name 属性与 value 值自动组合成一个完整的序列化表单对象。我们不再需要额外去拼接他们。w2f28资讯网——每日最新资讯28at.com

合成的序列化对象,我们称之为 FormData, 这是一个特殊的对象。我们可以直接通过如下方式获取到该对象。w2f28资讯网——每日最新资讯28at.com

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

iw2f28资讯网——每日最新资讯28at.com

我们无法直接观察到 FormData 的值,需要使用 .get 方法来获取。w2f28资讯网——每日最新资讯28at.com

FormData 也可以被网络请求支持,例如我们可以把 FormData 对象作为 fetch 请求的 body,直接发送。w2f28资讯网——每日最新资讯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}

在这个案例中,当 type='submit' 的按钮点击提交时,onsubmit 就会触发,我们可以在这个回调函数里执行自己的提交逻辑。w2f28资讯网——每日最新资讯28at.com

w2f28资讯网——每日最新资讯28at.com

HTTP 中 content-type 字段有专门支持 FormData 的值,如下所示:w2f28资讯网——每日最新资讯28at.com

Content-Type: multipart/form-data

除此之外,我们可以使用 form 元素的 action 属性来简化提交。不过它的表现会不太一样。w2f28资讯网——每日最新资讯28at.com

action 接收一个 URL 作为参数,可以是绝对路径,也是可以相对路径。它表示携带表单数据向该地址发送请求。默认情况下页面会跳转到指定的 URL 地址。w2f28资讯网——每日最新资讯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>

服务端可以拦截该地址,并定义响应行为。w2f28资讯网——每日最新资讯28at.com

这样做的好处就是我们可以简化提交行为的代码。无需使用 JavaScript 对逻辑进行任何额外的处理,就能完成一次提交操作。在没有额外要求的情况下,我们可以非常方便的使用这种方式来提交表单数据,上传文件等。w2f28资讯网——每日最新资讯28at.com

二、FormData 使用详解

FormData API 如下图所示。w2f28资讯网——每日最新资讯28at.com

w2f28资讯网——每日最新资讯28at.com

四、案例

学习了这些基础知识之后,我们来完成一个比较简单的案例。我们在表单中输入信息,并把信息记录展示在一个列表中。案例演示效果如下w2f28资讯网——每日最新资讯28at.com

w2f28资讯网——每日最新资讯28at.com

首先我们要定义一个数据,用于存储列表。w2f28资讯网——每日最新资讯28at.com

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

然后在 jsx 中,定义一个表单内容,和列表渲染。w2f28资讯网——每日最新资讯28at.com

<div>  <div>基础的表单提交案例</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 回调函数能拿到最新的 formdata。然后把对应的数据拿出来,设置到 posts 里面即可。w2f28资讯网——每日最新资讯28at.com

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

我们可以简单扩展一下,在这个基础之上做一些校验。我们把其中一个 input 做一些简单的调整。w2f28资讯网——每日最新资讯28at.com

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

在 css 中,新增如果校验不通过的样式。w2f28资讯网——每日最新资讯28at.com

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

演示效果如下:w2f28资讯网——每日最新资讯28at.com

w2f28资讯网——每日最新资讯28at.com

我们还可以通过 input 的 onInput 事件对验证样式进行自定义。w2f28资讯网——每日最新资讯28at.com

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

w2f28资讯网——每日最新资讯28at.com

这里面有许多状态可以支持我们做许多自己的扩展。w2f28资讯网——每日最新资讯28at.com

五、它对服务端渲染的划时代意义

这里大家需要注意的一个小细节就是,许多针对表单功能增强的 API,都不是从 react 中引入,而是从 react-dom 中引入。w2f28资讯网——每日最新资讯28at.com

w2f28资讯网——每日最新资讯28at.com

第一时间我还没想通这到底咋回事。感觉好奇怪。后来我才意识到,这对于服务端渲染有着巨大的划时代的重要意义。w2f28资讯网——每日最新资讯28at.com

在评估网页性能中,有一个重要的性能指标:TTI:可交互时间。页面加载完成,并且首屏显示,并且页面可以交互。w2f28资讯网——每日最新资讯28at.com

但是,在以前的服务端渲染项目中,想要页面元素可以被点击,可交互,需要经历一个重要的过程,那就是 Hydrate 水合。意思就是说,第一时间从服务端给到页面上的只是字符串,并不具备可交互功能,它需要浏览器渲染之后,变成 DOM 元素,再通过 React 水合之后,再变成 React 组件,然后才可以正常点击交互。w2f28资讯网——每日最新资讯28at.com

因此,React 服务端渲染项目虽然首屏直出理论上会快一些,但是 TTI 要多经历一个水合的过程,那么可交互时间等待就比较久了。w2f28资讯网——每日最新资讯28at.com

w2f28资讯网——每日最新资讯28at.com

其实也不一定,处理不好,服务端渲染项目也会更慢。w2f28资讯网——每日最新资讯28at.com

React 19 支持的 form action,实际上是极大的利用了浏览器的自带的表单能力,它要可交互,并不需要经历水合过程,浏览器渲染成 DOM 就可以正常交互了。w2f28资讯网——每日最新资讯28at.com

道友们,谁懂啊,这就有点厉害了。w2f28资讯网——每日最新资讯28at.com

w2f28资讯网——每日最新资讯28at.com

有的服务端渲染项目首屏渲染时间只需要不到 1s,但是首次可交互时间,能长达 8s 之久。从这个简单的数据对比,你就能领会不需要水合是多大的提升了。w2f28资讯网——每日最新资讯28at.com

这不仅在客户端组件中,直接挣脱了之前受控组件在性能上的桎梏,还更进一步在服务端渲染项目有更强的体现。如果一旦跟 next.js 有机结合...w2f28资讯网——每日最新资讯28at.com

不得不佩服 React 团队在设计项目架构解决方案上的超前思维。w2f28资讯网——每日最新资讯28at.com

六、总结

React form Action 是一个很小的知识点,但是它代表的是表单开发的另一种思路,是一种开发方式的隆重回归。因此这要求我们对 HTML 本身已经支持的表单能力要有所了解。我们在后续的开发使用中,会逐渐弱化受控组件的使用,这会带来开发体验和性能上的提升。w2f28资讯网——每日最新资讯28at.com

除此之外,React 在表单开发中还提供了许多功能增强的 hook,我们在后续的分享慢慢学习。w2f28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-100724-0.htmlReact 支持 Form Action 是在作妖?不,它是一种重磅回归

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 电商并发减库存设计,如何做到不超卖

下一篇: 记一次 .NET某上位视觉程序离奇崩溃分析

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • 三言两语说透设计模式的艺术-简单工厂模式

    一、写在前面工厂模式是最常见的一种创建型设计模式,通常说的工厂模式指的是工厂方法模式,是使用频率最高的工厂模式。简单工厂模式又称为静态工厂方法模式,不属于GoF 23种设计
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 三言两语说透柯里化和反柯里化

    JavaScript中的柯里化(Currying)和反柯里化(Uncurrying)是两种很有用的技术,可以帮助我们写出更加优雅、泛用的函数。本文将首先介绍柯里化和反柯里化的概念、实现原理和应用
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
  • 回归OPPO两年,一加赢了销量,输了品牌

    成为OPPO旗下主打性能的先锋品牌后,一加屡创佳绩。今年618期间,一加手机全渠道销量同比增长362%,凭借一加 11、一加 Ace 2、一加 Ace 2V三款爆品,一加
  • AI艺术欣赏体验会在上海梅赛德斯奔驰中心音乐俱乐部上演

    光影交错的镜像世界,虚实幻化的视觉奇观,虚拟偶像与真人共同主持,这些场景都出现在2019世界人工智能大会的舞台上。8月29日至31日,“AI艺术欣赏体验会”在上海
  • 电博会与软博会实现"线下+云端"的双线融合

    在本次“电博会”与“软博会”双展会利好条件的加持下,既可以发挥展会拉动人流、信息流、资金流实现快速交互流动的作用,继而推动区域经济良性发展;又可以聚
  • 北京:科技教育体验基地开始登记

      北京“科技馆之城”科技教育体验基地登记和认证工作日前启动。首批北京科技教育体验基地拟于2023年全国科普日期间挂牌,后续还将开展常态化登记。  北京科技教育体验基
Top