为什么说form元素是React的未来

 更新时间:2023年06月06日 08:38:11   作者:卡颂  
这篇文章主要介绍了为什么说form元素是React的未来,本文会带你聊聊React围绕form的布局与发展,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

思考一个问题

如果有一个HTML标签,React围绕他专门出了2个hook,那这个标签对React未来的发展一定非常重要,这没毛病吧?

这个标签就是 —— form

React围绕form新出了如下2个hook

  • useOptimistic
  • useFormStatus

Next.js的发展历程

说到React未来的发展,必须从Next.js聊起。毕竟,React团队成员不是加入Next团队,就是在加入的路上。

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

  • 根据后端数据渲染前端页面
  • 根据前端用户输入保存数据到后端

Next.js的发展主要围绕以上两点展开。

根据后端数据渲染前端页面

前期,Next.js的主打特性是SSRSSG。也就是把根据后端数据渲染前端页面的过程从前端挪到后端。

这个时期的Next.js路由被称为Pages Router

时间来到Next.js v13,以RSC(React Server Component)为核心的App Router取代Pages Router成为默认配置。

很多朋友不熟悉RSC,认为他是实验特性。实际上,RSC借由Next.js已经落地了。

一句话理解RSC —— 客户端组件(在浏览器渲染的React组件)可以根据依赖分为两部分:

  • 依赖数据源(比如数据库、文件系统)的组件,可以作为RSC(服务端组件)
  • 依赖状态(比如statepropscontext)的组件,可以作为客户端组件

从根据后端数据渲染前端页面角度看:

  • SSRSSG是页面级别的(服务端渲染呈现的是整个页面)
  • RSC是组件级别的(服务端组件请求数据源)

根据前端用户输入保存数据到后端

聊完了根据后端数据渲染前端页面,那么,围绕根据前端用户输入保存数据到后端,Next.js能做哪些优化?

这就要提到Next.js的实验特性 —— Server Action

Server Action

根据前端用户输入保存数据到后端的常见场景是表单提交,通常我们会在formobSubmit事件中做后续处理:

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。当提交表单(比如点击typesubmit的按钮)后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扩展了formaction属性,让他除了支持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,开发者可以直接在formaction属性(或者buttonformAction属性等其他几种属性)内书写后端逻辑,并且在浏览器禁用JS的情况下这些逻辑也能执行。

2个新hook

为了更好的服务server actionReact团队新出了2个hook用于提高form场景下的用户体验:

  • useOptimistic
  • useFormStatus

当前,这2个hook的介绍只能在Next.js文档(而不是React文档)中看到。

useOptimistic主要用来优化提交数据的用户体验。

比如,在点赞的场景,通常逻辑是:

  • 点击点赞按钮
  • 发起点赞请求
  • 点赞成功,前端显示点赞效果

但为了用户体验的流畅,前端通常会把逻辑做成:

  • 点击点赞按钮
  • 前端显示点赞效果(同时发起点赞请求)
  • 根据请求结果,如果点赞成功则不做处理,如果点赞失败则重置按钮

useOptimistic的本质就是在状态层面实现上述效果。

useFormStatus则用于在表单提交过程中显示pending状态:

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

有同学可能会疑惑:useFormStatus没有传参,他怎么知道对应哪个form

实际上,为了实现useFormStatusReact在源码内为所有HostComponent(即原生HTML元素对应组件,比如<div/>)定制了一个context

当某个form触发表单提交时,context的值会被更新为这个form的数据。useFormStatus本身仅仅是useContext(上述context)

总结

可以发现,不管是useFormStatususeOptimistic还是最近1~2年新出的hook(比如useIduseMutableSource),我们开发者都很少会用到。

因为这些hook都是为上层框架(主要是Next.js)提供的。

React早已完成他作为前端框架的使命。在他生命的后半程,他将作为上层框架的操作系统而存在。

server actionNext.js的未来,Next.jsReact的未来。所以,React的未来会围绕form元素持续布局。

以上就是form元素是React的未来的详细内容,更多关于form元素是React的未来的资料请关注脚本之家其它相关文章!

相关文章

  • 详解React开发必不可少的eslint配置

    详解React开发必不可少的eslint配置

    本篇文章主要介绍了详解React开发必不可少的eslint配置,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • react如何实现一个密码强度检测器详解

    react如何实现一个密码强度检测器详解

    这篇文章主要给大家介绍了关于react如何实现一个密码强度检测器的相关资料,使用这个密码强度器后可以帮助大家提高在线帐号、个人信息的安全性,需要的朋友可以参考下
    2021-06-06
  • 基于antd的autocomplete的二次封装查询示例

    基于antd的autocomplete的二次封装查询示例

    这篇文章主要为大家介绍了基于antd的autocomplete的二次封装查询示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • React中Hooks逻辑复用的实现

    React中Hooks逻辑复用的实现

    在React开发中,Hooks的出现彻底改变了逻辑复用的方式,本文就来介绍一下Hooks逻辑复用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • 利用React实现虚拟列表的示例代码

    利用React实现虚拟列表的示例代码

    虚拟列表,其实就是将一个原本需要全部列表项的渲染的长列表,改为只渲染可视区域内的列表项,但滚动效果还是要和渲染所有列表项的长列表一样。本文就将利用React实现虚拟列表,需要的可以参考一下
    2022-08-08
  • 从零开始最小实现react服务器渲染详解

    从零开始最小实现react服务器渲染详解

    这篇文章主要介绍了从零开始最小实现react服务器渲染详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-01-01
  • react项目使用json-server模拟接口获取数据的操作方法

    react项目使用json-server模拟接口获取数据的操作方法

    文章介绍了如何在React项目中使用json-server模拟接口并获取数据,首先安装json-server,创建JSON格式的数据文件,并在package.json中添加启动命令,启动服务后,可以通过指定的路径获取模拟的数据,感兴趣的朋友一起看看吧
    2025-11-11
  • react路由守卫的实现(路由拦截)

    react路由守卫的实现(路由拦截)

    react不同于vue,通过在路由里设置meta元字符实现路由拦截。本文就详细的介绍一下,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • JS中使用react-tooltip插件实现鼠标悬浮显示框

    JS中使用react-tooltip插件实现鼠标悬浮显示框

    前段时间遇到的一个需求,要求鼠标悬停显示使用描述, 用到了react-tooltip插件,今天写一个总结,感兴趣的朋友跟随小编一起看看吧
    2019-05-05
  • 实现React单页应用的方法详解

    实现React单页应用的方法详解

    今天我们来学习React是如何构建起一个单页应用的,React作为目前最流行的前端框架之一,其受欢迎程度不容小觑,从这门框架上我们可以学到许多其他前端框架所缺失的东西,也是其创新性所在的地方,比如虚拟DOM、JSX等。下面一起来看看。
    2016-08-08

最新评论