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

React 新 Hook:UseFormStatus 使用详解

来源: 责编: 时间:2024-07-17 07:44:48 773观看
导读一、action 支持异步回调一个令人振奋的特性就是,在 React19 中,action 支持传入异步回调函数。例如如下代码:async function formAction(formdata) { const title = formdata.get('title') const content = formdata.

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

一、action 支持异步回调

一个令人振奋的特性就是,在 React19 中,action 支持传入异步回调函数。VrC28资讯网——每日最新资讯28at.com

例如如下代码:VrC28资讯网——每日最新资讯28at.com

async function formAction(formdata) {  const title = formdata.get('title')  const content = formdata.get('content')  // 简单校验  if (!title || !content) {    return;  }  await new Promise(resolve => setTimeout(resolve, 1000))  setPosts(posts => [...posts, {title,content}])}
<form action={formAction}>  ...</form>

有了这个特性的支持,我们就可以非常方便的利用它来实现一些上传逻辑。不过一个小小的需求就是,点击提交之后,接口请求的过程中,我们希望按钮处于禁用状态,那应该怎么办呢?VrC28资讯网——每日最新资讯28at.com

React 19 提供了名为 useFormStatus 的 hook 来帮助我们做到这个事情。VrC28资讯网——每日最新资讯28at.com

二、useFormStatus

和别的 hook 不同的是,我们需要从 react-dom 中获取到它的引用。VrC28资讯网——每日最新资讯28at.com

import { useFormStatus } from "react-dom";

useFormStatus 能够在 form 元素的子组件中,获取到表单提交时的 pending 状态和表单内容。VrC28资讯网——每日最新资讯28at.com

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

与 form 同属于一个组件,获取不到,只能是封装后的子组件才能获取到。VrC28资讯网——每日最新资讯28at.com

const { pending, data, method, action } = useFormStatus();

pending 为 true 时,表示请求正在进行。我们可以利用这个值的变化在提交按钮上设置 Loading 样式。VrC28资讯网——每日最新资讯28at.com

data 格式为 FormData,表示此次提交里表单的所有内容。VrC28资讯网——每日最新资讯28at.com

method 表示我们在提交时,所采用的请求方式,默认值为 get。VrC28资讯网——每日最新资讯28at.com

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

需要注意的是,提交方式并不需要通过如下方式设置,这样做会报错。VrC28资讯网——每日最新资讯28at.com

<form method="post"></form>

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

这里主要是针对提交按钮做的操作,因此我们需要单独将提交按钮相关的部分拿出来封装成为一个子组件,并在子组件中利用 useFormStatus 获取异步 action 的 pending 状态。VrC28资讯网——每日最新资讯28at.com

代码非常的简单,如下所示:VrC28资讯网——每日最新资讯28at.com

function SubmitButton() {  const {pending} = useFormStatus()    return (    <div className="form_item">      <button        className='primary'        type='submit'        disabled={pending}      >        {pending ? 'Submitting...' : 'Submit'}      </button>          </div>  )}

然后在 form 元素中使用该组件即可。VrC28资讯网——每日最新资讯28at.com

<form actinotallow={formAction} method="post">  <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>    <SubmitButton /></form>

四、案例二:提交时禁止输入内容

通常情况下,我们也希望在表单提交时,不允许输入内容。useFormStatus 可以很容易帮我们做到这一点。VrC28资讯网——每日最新资讯28at.com

实现非常简单,我们将某一个字段单独封装到子组件中,利用 useFormStatus 提供的 pending 状态来判断是否禁用输入,代码如下:VrC28资讯网——每日最新资讯28at.com

function Input2({required, name}) {  const {pending} = useFormStatus()  return (    <div className="form_item">      <div className="label">Name</div>      <input        name={name}        type="text"        placeholder='Enter you name'        disabled={pending}      />    </div>  )}
<form action={formAction}>  <div className="form_item">    <div className="label">Title</div>    <input name='title' type="text" placeholder='Enter title' />  </div>  <Input2 required name='content' />  <SubmitButton /></form>

五、总结

useFormStatus 是结合 action 异步请求时使用的 hook,它们是对 HTML 表单能力的增强。因此我们可以借助他们与 HTML 表单元素自身支持的特性实现更复杂的表单交互逻辑。VrC28资讯网——每日最新资讯28at.com

这里我们需要注意的是 action 与 onSubmit 的区别。onSubmit 会优先于 action 执行。并且,如果我们在 onSubmit 的回调函数中,使用了 preventDefault,action 回调将不会执行。VrC28资讯网——每日最新资讯28at.com

function onSubmit(e) {  e.preventDefault()  // ...}

在 onSubmit 中,我们可以结合 state,通过控制数据的行为来自定义表单行为,而无需过多依赖 HTML 表单元素本身的能力。具体如何抉择大家需要根据自身项目的需求情况来定。VrC28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-101273-0.htmlReact 新 Hook:UseFormStatus 使用详解

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

上一篇: 别做平庸Coder!掌握这十个架构绝技,让你成为团队MVP

下一篇: 线程池遇到父子任务,有大坑,要注意!

标签:
  • 热门焦点
  • 在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • 每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 重估百度丨大模型,能撑起百度的“今天”吗?

    自象限原创 作者|程心 罗辑2023年之前,对于自己的&ldquo;今天&rdquo;,百度也很迷茫。&ldquo;新业务到 2022 年底还是 0,希望 2023 年出来一个 1。&rdquo;这是2022年底,李彦宏
  • 微博大门常打开,迎接海外画师漂洋东渡

    作者:互联网那些事&ldquo;起猛了,我能看得懂日语了&rdquo;。&ldquo;为什么日本人说话我能听懂?&rdquo;&ldquo;中文不像中文,日语不像日语,但是我竟然看懂了&rdquo;&hellip;&hell
  • iQOO 11S新品发布会

    iQOO将在7月4日19:00举行新品发布会,推出杭州亚运会电竞赛事官方用机iQOO 11S。
  • onebot M24巧系列一体机采用轻薄机身设计,现已在各平台开售

    onebot M24 巧系列一体机目前已在线上线下各平台同步开售。onebot M24 巧系列采用一体化轻薄机身设计,最薄处为 10.15mm,拥有宝石红、午夜蓝、石墨绿、雅致
  • 外交部:美方应停止在网络安全问题上不负责任地指责他国

      中国外交部今天(16日)举行例行记者会。会上,有记者问,美国情报官员称,他们正在阻拦来自中国以及其他国家的黑客获取相关科研成果。 中方对此有何评论?对此
Top