React全新实验性Hooks:useOptimistic、useFormStatus

简介: React全新实验性Hooks:useOptimistic、useFormStatus

近日,React 中引入了两个实验性 Hooks:useOptimisticuseFormStatus,下面就分别来这两个 Hooks 都有什么用处!

useOptimistic

实验性 useOptimistic Hooks 提供了一种在应用中实现乐观更新的方法。 乐观更新是一种通过使应用看起来响应更快来增强用户体验的技术。

在实际场景中,往往会遇到一些需要与服务器进行异步交互的情况,比如消息发送。为了提升用户体验,在这类操作中,我们通常希望优先显示新数据或新状态,而不是等待服务器返回响应后再进行更新。这样做可以让用户立即感知到自己的操作已经被执行,降低等待时间和不确定性。

useOptimistic 钩子就是为了支持这种优化而设计的。当组件通过该钩子创建一个新状态时,可以指定一个函数,用于在每次更新状态时生成一个新的状态数组。这个函数可以在新状态中添加一些临时数据,比如正在发送的消息等。同时,将这些临时数据展示给用户,使其可以及时地感知到自己的操作已经被执行,从而提高交互体验。

来看下面的例子:

import { experimental_useOptimistic as useOptimistic } from 'react';
import { send } from './_actions.js';
export function Thread({ messages }) {
  const [optimisticMessages, addOptimisticMessage] = useOptimistic(
    messages,
    (state, newMessage) => [...state, { message: newMessage, sending: true }],
  );
  const formRef = useRef();
  return (
    <div>
      {optimisticMessages.map((m) => (
        <div>
          {m.message}
          {m.sending ? 'Sending...' : ''}
        </div>
      ))}
      <form
        action={async (formData) => {
          const message = formData.get('message');
          formRef.current.reset();
          addOptimisticMessage(message);
          await send(message);
        }}
        ref={formRef}
      >
        <input type="text" name="message" />
      </form>
    </div>
  );
}

这段代码实现了消息展示和发送功能。

  • 首先定义了一个名为Thread的组件,其接收一个名为messages的属性作为输入,用于展示当前线程所有消息。
  • 接下来,通过useOptimistic钩子,创建了一个名为optimisticMessages的新状态和一个名为addOptimisticMessage的回调函数,用于在表单提交前更新消息列表,并支持乐观地添加一条新消息到列表中,同时会显示"Sending..."字样,表示正在发送中。
  • 最后,返回了包含了消息列表和消息发送表单的元素。其中,使用了Array.map()方法遍历optimisticMessages状态,渲染出每一条消息以及可能的"Sending..."字样。表单元素则使用<input>标签定义文本输入框,将用户输入的消息内容传递给send()方法,并且当表单提交时,调用了addOptimisticMessage()回调函数,将输入的消息添加到消息列表中进行展示,并在待发送状态时显示"Sending..."字样。

这就是我们上面提到的乐观更新,即在消息发送过程中可以先预期显示该条消息,这样可以使用户的操作感受更加流畅。

useFormStatus

实验性 useFormStatus Hook 可以在表单操作中使用,它提供了 pending 属性。


import { experimental_useFormStatus as useFormStatus } from 'react-dom';
function Submit() {
  const { pending } = useFormStatus();
  return (
    <input
      type="submit"
      className={pending ? 'button-pending' : 'button-normal'}
      disabled={pending}
    >
      提交
    </input>
  );
}

这段代码使用了实验性的 useFormStatus Hook,它从 react-dom 库中导入。useFormStatus Hook 可以在表单操作(比如提交、重置等)中使用,提供了一个 pending 属性,表示当前是否正在处理中。在这段代码中,将 pending 属性用于控制 <input> 元素的 classNamedisabled 属性。

除此之外,useFormStatus 还提供了 data, action, method 属性:

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

useFormStatus Hook 可以用于实现加载指示器等功能。可以把它当作使用 useTransition Hook 实现加载状态的一种快捷方式。目前,该 Hook 仅在实验性通道中提供,会在接近稳定版本发布时分享文档。它内部实现使用 startTransitioncontext 对象。这是理解其行为的一种好方法,但实际的实现细节未来可能会有所改变。

相关文章
|
2月前
|
前端开发 JavaScript 开发者
深入理解React Hooks:提升前端开发效率的关键
【10月更文挑战第5天】深入理解React Hooks:提升前端开发效率的关键
|
2月前
|
前端开发 JavaScript
React Hooks 全面解析
【10月更文挑战第11天】React Hooks 是 React 16.8 引入的新特性,允许在函数组件中使用状态和其他 React 特性,简化了状态管理和生命周期管理。本文从基础概念入手,详细介绍了 `useState` 和 `useEffect` 的用法,探讨了常见问题和易错点,并提供了代码示例。通过学习本文,你将更好地理解和使用 Hooks,提升开发效率。
77 4
|
2月前
|
前端开发
深入解析React Hooks:构建高效且可维护的前端应用
本文将带你走进React Hooks的世界,探索这一革新特性如何改变我们构建React组件的方式。通过分析Hooks的核心概念、使用方法和最佳实践,文章旨在帮助你充分利用Hooks来提高开发效率,编写更简洁、更可维护的前端代码。我们将通过实际代码示例,深入了解useState、useEffect等常用Hooks的内部工作原理,并探讨如何自定义Hooks以复用逻辑。
|
2月前
|
前端开发 JavaScript API
探索React Hooks:前端开发的革命性工具
【10月更文挑战第5天】探索React Hooks:前端开发的革命性工具
|
28天前
|
前端开发 JavaScript API
探究 React Hooks:如何利用全新 API 优化组件逻辑复用与状态管理
本文深入探讨React Hooks的使用方法,通过全新API优化组件逻辑复用和状态管理,提升开发效率和代码可维护性。
|
1月前
|
前端开发
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
23 3
|
1月前
|
前端开发 JavaScript
深入探索React Hooks:从useState到useEffect
深入探索React Hooks:从useState到useEffect
|
1月前
|
前端开发 JavaScript 开发者
“揭秘React Hooks的神秘面纱:如何掌握这些改变游戏规则的超能力以打造无敌前端应用”
【10月更文挑战第25天】React Hooks 自 2018 年推出以来,已成为 React 功能组件的重要组成部分。本文全面解析了 React Hooks 的核心概念,包括 `useState` 和 `useEffect` 的使用方法,并提供了最佳实践,如避免过度使用 Hooks、保持 Hooks 调用顺序一致、使用 `useReducer` 管理复杂状态逻辑、自定义 Hooks 封装复用逻辑等,帮助开发者更高效地使用 Hooks,构建健壮且易于维护的 React 应用。
35 2
|
2月前
|
前端开发 开发者
React 提供的其他重要 Hooks
【10月更文挑战第20天】React 提供了一系列强大的 Hooks,除了 `useRef` 之外,还有许多其他重要的 Hooks,它们共同构成了函数式组件开发的基础。
40 6
|
25天前
|
前端开发 JavaScript
React Hooks 深入解析
React Hooks 深入解析
23 0