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

React 新 Hook:UseFormStatus 使用详解

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

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

一、action 支持异步回调

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

例如如下代码:wO328资讯网——每日最新资讯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>

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

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

二、useFormStatus

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

import { useFormStatus } from "react-dom";

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

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

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

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

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

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

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

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

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

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

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

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

代码非常的简单,如下所示:wO328资讯网——每日最新资讯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 元素中使用该组件即可。wO328资讯网——每日最新资讯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 可以很容易帮我们做到这一点。wO328资讯网——每日最新资讯28at.com

实现非常简单,我们将某一个字段单独封装到子组件中,利用 useFormStatus 提供的 pending 状态来判断是否禁用输入,代码如下:wO328资讯网——每日最新资讯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 表单元素自身支持的特性实现更复杂的表单交互逻辑。wO328资讯网——每日最新资讯28at.com

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

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

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

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

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

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

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

标签:
  • 热门焦点
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 印度登月最关键一步!月船三号今晚进入环月轨道

    8月5日消息,据印度官方消息,月船三号将于北京时间今晚21时30分左右开始近月制动进入环月轨道。这是该探测器能够成功的最关键步骤之一,如果成功将开始围
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对&ldquo;势&rdquo;的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 品牌洞察丨服务本地,美团直播成效几何?

    来源:17PR7月11日,美团App首页推荐位出现&ldquo;美团直播&rdquo;的固定入口。在直播聚合页面,外卖&ldquo;神枪手&rdquo;直播间、美团旅行直播间、美团买菜直播间等均已上线,同时
  • 质感不错!OPPO K11渲染图曝光:旗舰IMX890传感器首次下放

    一直以来,OPPO K系列机型都保持着较为均衡的产品体验,历来都是2K价位的明星机型,去年推出的OPPO K10和OPPO K10 Pro两款机型凭借各自的出色配置,堪称有
  • 滴滴违法违规被罚80.26亿 共存在16项违法事实

    滴滴违法违规被罚80.26亿 存在16项违法事实开始于2121年7月,历经一年时间,网络安全审查办公室对“滴滴出行”网络安全审查终于有了一个暂时的结束。据“网信
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top