探索 React 19:4个可能正式发布的新 hook

本文为翻译作品,原文链接:Exploring React 19: 4 New Hooks for Practical Use

React 开发者们,准备好 React 新版本发布吧!React 团队不会发布 v18.3版本了,他们目前正在开发 React v19 版本。开发者的期待的功能中有四个新的 hook------旨在解决 React 中两个常见的痛点:数据获取和表单处理。虽然这些 hook 目前作为实验性 API 在 React 预览版本中可用,但它们预计将成为 React 19 的稳定功能,并且在最终发布之前可能会有 API 更改。

让我们深入了解这些新 hook:

1. use

use hook 是一个实验性的 React hook,允许你以类似于使用 Promise 或上下文的方式从资源(如 promise 或上下文)中读取值。

javascript 复制代码
const value = use(resource);

更多详情请查看官方文档

示例:

typescript 复制代码
import * as React from 'react';
import { useState, use, Suspense } from 'react';
import { faker } from '@faker-js/faker';

export const App = () => {
  const [newsPromise, setNewsPromise] = useState(() => fetchNews());

  const handleUpdate = () => {
    fetchNews().then((news) => {
      setNewsPromise(Promise.resolve(news));
    });
  };

  return (
    <>
      <h3>
        新闻列表
        <button onClick={handleUpdate}>刷新</button>
      </h3>
      <NewsContainer newsPromise={newsPromise} />
    </>
  );
};

let news = [...new Array(4)].map(() => faker.lorem.sentence());

const fetchNews = () =>
  new Promise<string[]>((resolve) =>
    setTimeout(() => {
      news.unshift(faker.lorem.sentence());
      resolve(news);
    }, 1000)
  );

const NewsContainer = ({ newsPromise }) => (
  <Suspense fallback={<p>加载中...</p>}>
    <News newsPromise={newsPromise} />
  </Suspense>
);

const News = ({ newsPromise }) => {
  const news = use<string[]>(newsPromise);
  return (
    <ul>
      {news.map((title, index) => (
        <li key={index}>{title}</li>
      ))}
    </ul>
  );
};

这个示例展示了如何使用 use hook 进行异步数据获取,为了提高用户体验,本示例中还在请求期间用 Suspense 显示了加载状态。

2. useOptimistic

useOptimistic hook 使得在执行类似提交表单这样的操作时,能够对 UI 进行乐观更新,增强用户体验。它特别适用于在等待服务器响应时,希望对 UI 进行乐观更新的场景。

译者注:乐观更新"(Optimistic Updates)是一种前端开发中的策略,用于在没有从服务器得到响应之前,先在前端显示预期的操作结果。例如下面的例子中,前端添加购物车时,未收到后端返回时即在前端更新未已添加到购物车。这样做的目的是为了提升用户体验,使应用感觉更加快速和响应。

javascript 复制代码
import { useOptimistic } from 'react';

function AppContainer() {
  const [optimisticState, addOptimistic] = useOptimistic(
    state,
    (currentState, optimisticValue) => {
      // 合并并返回新状态与乐观值
    },
  );
}

示例:

javascript 复制代码
import { useState, useOptimistic } from 'react';

const AddToCartForm = ({ id, title, addToCart, optimisticAddToCart }) => {
  const formAction = async (formData) => {
    optimisticAddToCart({ id, title });
    try {
      await addToCart(formData, title);
    } catch (e) {
      // 处理错误
    }
  };

  return (
    <form action={formAction}>
      <h2>{title}</h2>
      <input type="hidden" name="itemID" value={id} />
      <button type="submit">加入购物车</button>
    </form>
  );
};

在这个示例中,useOptimistic hook 被用来在添加物品到购物车时乐观地更新 UI,提供了更顺滑的用户体验。

3. useFormState

useFormState hook 允许你基于表单操作的结果来更新状态。它特别适用于根据表单提交的结果显示确认或错误消息。

javascript 复制代码
const [state, formAction] = useFormState(fn, initialState);

示例:

javascript 复制代码
import { useState } from 'react';
import { useFormState } from 'react-dom';

const AddToCartForm = ({ id, title, addToCart }) => {
  const addToCartAction = async (prevState, formData) => {
    try {
      await addToCart(formData, title);
      return '成功添加';
    } catch (e) {
      return '添加失败:缺货';
    }
  };

  const [message, formAction] = useFormState(addToCartAction, null);

  return (
    <form action={formAction}>
      <h2>{title}</h2>
      <input type="hidden" name="itemID" value={id} />
      <button type="submit">加入购物车</button>&nbsp;
      {message}
    </form>
  );
};

这个示例展示了如何使用 useFormState hook 基于表单提交的结果来显示成功或错误消息。

4. useFormStatus

useFormStatus hook 允许你检索有关最后一次表单提交的信息,例如表单是否处于等待状态、提交的数据、使用的 HTTP 方法和动作函数。

javascript 复制代码
const { pending, data, method, action } = useFormStatus();

示例:

javascript 复制代码
import { useFormStatus } from 'react-dom';

const SubmitButton = () => {
  const { pending } = useFormStatus();
  return (
    <button disabled={pending} type="submit">
      加入购物车
    </button>
  );
};

在这个示例中,useFormStatus hook 被用来在表单处于提交等待状态时禁用提交按钮,为用户提供一个视觉指示。

总结

React 19 中这些新的 hook 为处理数据获取和表单交互带来了全新的开发体验,提供了更多的灵活性和改善的用户体验。由于这些是实验性 API,开发者被鼓励在 React 19 的最终发布前,随时关注官方 React 文档中的变更。

相关推荐
魏大帅。几秒前
Axios 的 responseType 属性详解及 Blob 与 ArrayBuffer 解析
前端·javascript·ajax
花花鱼7 分钟前
vue3 基于element-plus进行的一个可拖动改变导航与内容区域大小的简单方法
前端·javascript·elementui
k093310 分钟前
sourceTree回滚版本到某次提交
开发语言·前端·javascript
EricWang135832 分钟前
[OS] 项目三-2-proc.c: exit(int status)
服务器·c语言·前端
September_ning32 分钟前
React.lazy() 懒加载
前端·react.js·前端框架
web行路人41 分钟前
React中类组件和函数组件的理解和区别
前端·javascript·react.js·前端框架
番茄小酱00143 分钟前
Expo|ReactNative 中实现扫描二维码功能
javascript·react native·react.js
超雄代码狂1 小时前
ajax关于axios库的运用小案例
前端·javascript·ajax
长弓三石1 小时前
鸿蒙网络编程系列44-仓颉版HttpRequest上传文件示例
前端·网络·华为·harmonyos·鸿蒙
小马哥编程1 小时前
【前端基础】CSS基础
前端·css