React 19 带来了诸多创新

React 19 带来了诸多创新,旨在提升现代 Web 开发的效率、速度和用户友好性。关键改进包括服务器端组件处理、高级数据加载方法、简化的表单管理以及灵活的ref使用方式。这些变化标志着 React 19 向前迈出了重要一步。本文将深入分析每一项新特性,并提供丰富的示例。

主要特点:

  • React 编译器:将 React 代码转换为优化的 JavaScript,性能可能提升一倍。
  • 操作:简化数据更新,特别是表单数据更新。
  • 服务器组件:通过服务器端渲染,实现更快的加载速度和更好的 SEO。
  • 增强型 Hooks:提供对组件生命周期的更多控制。
  • 资源加载:预加载资源以实现更流畅的过渡。
  • Web 组件:增强了开发的兼容性和灵活性。

1.服务器组件:性能和 SEO 改进

React 19 最显著的特性之一是服务器端组件处理。服务器端组件在服务器端运行,将预渲染的 HTML 发送到客户端,从而大幅缩短加载时间并提升 SEO 效果。

javascript 复制代码
// MyComponent.server.js
export default function MyComponent() {
  const data = fetch('https://api.example.com/data').then(res => res.json());
  return <div>{data.title}</div>;
}

在这个例子中,MyComponent数据在服务器端进行处理,并以预渲染的 HTML 形式发送到浏览器。这使得用户能够更快地加载页面,同时确保服务器端的数据安全。

2. Actions API:表单管理和基于操作的请求

Actions API 用于管理客户端和服务器之间的数据更新。它简化了表单交互的处理,并能快速响应用户操作。

例子:

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

const updateUser = createAction(async (data) => {
  await fetch('/api/update-user', {
    method: 'POST',
    body: JSON.stringify(data),
  });
});

function UserProfile() {
  return (
    <form onSubmit={updateUser}>
      <input name="username" placeholder="Username" />
      <button type="submit">Update</button>
    </form>
  );
}

在这个例子中,该updateUser函数直接向服务器发送数据,从而可以快速完成表单提交。

3.use()钩子:数据获取和上下文管理

React 19 引入了use()Hook 来简化数据管理。这个 Hook 让我们能够以更简洁、更直接的方式处理上下文值或异步操作。

例子:

javascript 复制代码
// context.js
export const UserContext = createContext();

// App.js
import { use, UserContext } from './context';

function UserProfile() {
  const user = use(UserContext);
  return <div>{user.name}</div>;
}

这种用法使代码更易读,尤其是在基于上下文的数据管理中。

使用use()钩子进行数据获取而无需创建上下文

让我们创建一个示例,演示如何使用use()钩子处理异步数据而无需设置上下文。此示例演示use()如何使用异步数据源:

例子:

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

// Fake async data fetching function
async function fetchUser() {
  const response = await fetch('https://jsonplaceholder.typicode.com/users/1');
  return response.json();
}

// `use()` Hook directly utilizes the async data
function UserProfile() {
  const user = use(fetchUser());

  return (
    <div>
      <h1>{user.name}</h1>
      <p>Email: {user.email}</p>
      <p>Website: {user.website}</p>
    </div>
  );
}

export default UserProfile;

fetchUser 函数:异步地从 API 检索用户数据。

use(fetchUser()) : 该use()钩子使用异步函数返回的数据,自动管理加载过程。

数据使用 :数据加载后user,直接在组件内使用,在屏幕上显示用户详细信息。

4.预取和资源加载:用户体验的关键改进

库中的诸如prefetchDNS、、和之类的方法可以加快对网络和数据资源的访问preconnectpreload``preinit``react-dom

例子:

python 复制代码
import { prefetchDNS, preconnect, preload, preinit } from 'react-dom';

prefetchDNS('https://example.com');
preconnect('https://api.example.com');
preload('/assets/image.png', { as: 'image' });
preinit('/scripts/library.js', { as: 'script' });

通过这些方法,用户可能需要的资源会被预先加载,从而提供更流畅的体验。

a.

React 19 对异步脚本的支持更加高效,能够更有效地管理标记为异步的脚本async。这对于更快地加载第三方库或外部 API 尤为有利。

例子:

csharp 复制代码
import { preinit } from 'react-dom';

preinit('https://example.com/library.js', { as: 'script', async: true });

通过这种方法,指定的脚本会异步加载,从而提高应用程序的性能。

b. React 19 的样式表支持

javascript 复制代码
允许使用 `<style> ` 和 `  
<style>` 更高效地加载样式表。样式表可以在用户访问页面之前在后台预加载,从而改善整体加载体验。`preload``preconnect`

**例子:**  



import { preload } from 'react-dom';

preload('/styles/main.css', { as: 'style' });

这样可以确保main.css文件在页面加载之前准备就绪,从而加快初始渲染速度。

5.表单管理的 新功能useFormStatus和钩子useFormState

React 19 引入了用于管理表单状态和数据的新 Hooks。借助useFormStatus()`` formStatesuseFormState()``formDatas,跟踪表单状态和用户输入变得更加轻松高效。

例子:

javascript 复制代码
import { useFormStatus, useFormState } from 'react';

function ContactForm() {
  const { isSubmitting } = useFormStatus();
  const { values } = useFormState();

  return (
    <form>
      <input name="email" placeholder="Email" />
      <button disabled={isSubmitting}>Send</button>
      {values.email && <p>Email Address: {values.email}</p>}
    </form>
  );
}

这些钩子使表单提交过程更加顺畅,并改善用户体验。

6.ref回调函数的使用:管理父子关系中的引用

在 React 19 中,ref回调函数取代了 <div> 标签forwardRef,从而在父组件和子组件之间提供了更灵活的通信方式。

例子:

javascript 复制代码
import { useRef, useEffect } from 'react';

function ChildInput({ innerRef }) {
  return (
    <input
      ref={(ref) => {
        innerRef(ref);
        if (ref) {
          console.log('Child Input ref created:', ref);
        }
      }}
      placeholder="Text Input..."
    />
  );
}

function ParentComponent() {
  const inputRef = useRef();

  useEffect(() => {
    if (inputRef.current) {
      inputRef.current.focus();
      console.log('Parent focuses the child input');
    }

    return () => {
      console.log('Cleaning up parent reference');
    };
  }, []);

  return (
    <div>
      <h1>Parent-Child Ref Example</h1>
      <ChildInput innerRef={(ref) => (inputRef.current = ref)} />
    </div>
  );
}

在这个例子中,父组件可以访问input子组件内的元素并对其执行操作。

7.用于Suspense并发渲染

React 19 引入了并发渲染,以优化组件的处理速度。这项特性使用户能够更快速高效地与界面交互。它以响应速度为优先,管理组件的渲染,从而使应用程序运行更流畅、交互性更强。

例子:

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

function DataComponentFirst() {
  const data = fetch('/api/data/first').then(res => res.json());
  return <div>{data}</div>;
}

function DataComponentSecond() {
  const data = fetch('/api/data/second').then(res => res.json());
  return <div>{data}</div>;
}

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <DataComponentFirst />
      <DataComponentSecond />
    </Suspense>
  );
}

并发渲染DataComponentFirst同时DataComponentSecond开始加载,但数据先准备好的那个会先显示。

异步处理 :React 会先显示数据加载完成的组件,而其他组件仍在继续加载。例如,如果一个DataComponentFirst组件先加载完成,它就会显示在屏幕上,而另一个组件DataComponentSecond加载完成后才会显示出来。

总结:这样,数据会在可用时立即显示给用户,而无需等待其他组件,从而实现更快、更人性化的数据加载过程。

b. 多数据加载管理

Suspense现在可以嵌套多个数据源,使数据加载过程更加灵活。

例子:

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

function DataComponent1() {
  const data1 = fetchDataFromAPI1();
  return <div>{data1}</div>;
}

function DataComponent2() {
  const data2 = fetchDataFromAPI2();
  return <div>{data2}</div>;
}

function App() {
  return (
    <div>
      <Suspense fallback={<div>Loading... (1)</div>}>
        <DataComponent1 />
        <Suspense fallback={<div>Loading... (2)</div>}>
          <DataComponent2 />
        </Suspense>
      </Suspense>
    </div>
  );
}

该示例通过高效管理数据加载过程,提供了更好的用户体验。

8.自动代码分割:自动代码分区

React 19 通过允许应用程序仅在需要时加载必要的代码来提高性能,从而减少初始包大小并缩短加载时间。

例子:

javascript 复制代码
const LazyComponent = React.lazy(() => import('./HeavyComponent'));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <LazyComponent />
    </Suspense>
  );
}

这种用法通过仅在需要时加载大型组件来提高性能。

9.文档元数据管理

React 19 增强了对
、 和 元素的管理支持<title>,<meta>使<link>SEO 优化和页面标题的处理更加容易。

例子:

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

function SEOPage() {
  return (
    <DocumentHead>
      <title>Custom Title - React 19</title>
      <meta name="description" content="Learn about the new features of React 19." />
    </DocumentHead>
  );
}

10.样式表管理

React 19 优化了 CSS 和其他样式文件的加载,从而在页面过渡过程中提供更流畅的体验。它改进了标签管理,确保样式能够更高效地应用。

例子:

javascript 复制代码
import './styles.css';

function StyledComponent() {
  return <div className="styled">This component uses a stylesheet.</div>;
}

11. useSyncExternalStore(与外部数据源同步)

React 19 引入了 useSyncExternalStore hook,用于订阅外部数据源。这使得应用程序中全局数据的处理更加高效。

例子:

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

function useWindowSize() {
  return useSyncExternalStore(
    (onChange) => window.addEventListener('resize', onChange),
    () => ({ width: window.innerWidth, height: window.innerHeight })
  );
}

function WindowSizeComponent() {
  const size = useWindowSize();
  return <div>Window Size: {size.width} x {size.height}</div>;
}

此示例创建了一个能够响应窗口大小变化的组件。

12.指令

'use client'诸如 @append@server 之类的指令'use server'可以强制规定组件应该在客户端还是服务器端运行。这明确了组件的渲染位置,有助于更有效地管理其行为和性能。

例子:

javascript 复制代码
'use client';

export default function ClientOnlyComponent() {
  return <div>Runs on the client only</div>;
}

13.自动代码分割(自动代码分割)

React 19 通过自动化基于组件的代码拆分来加速页面加载。它确保仅在需要时加载必要的代码,从而优化性能并减小初始包大小。

例子:

javascript 复制代码
const LazyComponent = React.lazy(() => import('./HeavyComponent'));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <LazyComponent />
    </Suspense>
  );
}

14.资产加载

React 19 让加载图片和视频等后台资源变得更加容易。通过在页面切换期间预加载这些资源,可以减少等待时间,确保更流畅的导航,从而改善用户体验。

例子:

javascript 复制代码
const MyLazyImage = React.lazy(() => import('./MyImage'));

function Gallery() {
  return (
    <Suspense fallback={<div>Image Loading...</div>}>
      <MyLazyImage />
    </Suspense>
  );
}

15. Web 组件支持

在 React 19 中,Web Components 与 React 组件的兼容性得到了提升。这一改进使得使用不同框架开发的组件更容易集成到 React 应用程序中,从而增强了互操作性和灵活性。

例子:

scala 复制代码
class MyCustomElement extends HTMLElement {
  connectedCallback() {
    this.innerHTML = `<p>React with Web Component</p>`;
  }
}
customElements.define('my-custom-element', MyCustomElement);

function App() {
  return <my-custom-element></my-custom-element>;
}

React 19 允许这类自定义组件无缝运行。

16.使用乐观的新钩子

React 19 中引入的 useOptimistic hook 旨在使用户界面更加流畅。它尤其适用于对发送到服务器的操作进行乐观更新,即使在服务器响应之前,也能使更改立即反映在 UI 上,而不会出现延迟。

例子:

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

function LikeButton({ initialLikes }) {
  const [likes, updateLikes] = useOptimistic(initialLikes, (currentLikes) => currentLikes + 1);

  return (
    <button onClick={() => updateLikes()}>
      {likes} Like
    </button>
  );
}

useOptimistic :接受一个初始值作为第一个参数(例如,initialLikes)。

乐观更新updateLikes调用时,UI 中会立即更新点赞数。

UI响应速度:在服务器响应之前,更新内容会提前显示,从而提供更流畅的用户体验。

这样一来,无需等待流程完成即可立即进行 UI 更改,从而增强用户交互。

高级示例 :更复杂的用法useOptimistic包括在向服务器提交数据期间处理错误和回滚的同时管理乐观更新,平衡响应性和可靠性。

例子:

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

async function updateServerLikes(likes) {
  const response = await fetch('/api/update-likes', {
    method: 'POST',
    body: JSON.stringify({ likes }),
  });
  if (!response.ok) {
    throw new Error('Failed to update likes');
  }
}

function LikeButton({ initialLikes }) {
  const [error, setError] = useState(null);
  const [likes, updateLikes] = useOptimistic(
    initialLikes,
    (currentLikes, setOptimisticValue) => {
      // Optimistically increase the new value
      setOptimisticValue(currentLikes + 1);

      // Send the update to the server
      updateServerLikes(currentLikes + 1).catch((err) => {
        // Roll back the optimistic value in case of an error
        setOptimisticValue(currentLikes);
        setError('Server error: Update failed');
      });
    }
  );

  return (
    <div>
      <button onClick={() => updateLikes()}>Like ({likes})</button>
      {error && <p style={{ color: 'red' }}>{error}</p>}
    </div>
  );
}

错误处理updateServerLikes异步函数会将新的点赞数发送到服务器。如果更新失败,则会抛出错误。

乐观更新 :使用useOptimisticsetOptimisticValue,点赞数会在用户界面中立即更新,无需等待服务器响应。

错误回滚 :如果updateServerLikes失败,则将增加的点赞数回滚,并向用户显示错误消息。

流畅的用户体验:用户在请求发送到服务器的同时即可立即看到更新后的点赞数。

可靠性 :如果服务器更新失败,useOptimistic则回滚更改以防止显示不正确的数据显示。

视觉反馈:用户在出错时会立即收到反馈,从而提高他们对交互的理解。

17.useDeferredValue初始值

useDeferredValue钩子函数可以提升繁重计算任务期间的 UI 响应速度。通过设置初始值,它可以实现对延迟更新更可控的过渡。

例子:

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

function SearchComponent({ searchTerm }) {
  const deferredSearchTerm = useDeferredValue(searchTerm, {
    initialValue: ''
  });

  return <div>Searching for: {deferredSearchTerm}</div>;
}

在这个例子中deferredSearchTerm只有当值发生变化时才会延迟更新searchTerm。这减少了用户输入时的延迟,从而创建了更流畅的界面。

这些特性进一步强化了 React 19 对性能和用户体验的关注,尤其是在处理密集型数据处理或外部资源时。

结论:

React 19 为现代 Web 开发提供了强大而灵活的工具。诸如服务器组件和 Actions API 等特性,useOptimistic()能够为 Web 应用程序带来更快、更友好的用户体验。升级到 React 19 是提升性能和改善用户交互体验的重要一步。

相关推荐
im_AMBER2 小时前
高并发下的列表乱序与文档同步
前端·react.js·架构
前进的李工2 小时前
LangChain使用之Model IO(提示词模版之ChatPromptTemplate)
java·前端·人工智能·python·langchain·大模型
漫随流水2 小时前
旅游推荐系统(login.html)
前端·html·旅游
1024小神2 小时前
记录xcode项目swiftui配置APP加载启动图
前端·ios·swiftui·swift
CHU7290352 小时前
社区生鲜买菜小程序前端功能版块设计及玩法介绍
前端·小程序
尤山海3 小时前
深度防御:内容类网站如何有效抵御 SQL 注入与脚本攻击(XSS)
前端·sql·安全·web安全·性能优化·状态模式·xss
前端小趴菜053 小时前
Windi CSS
前端·css
xuankuxiaoyao3 小时前
VUE.JS 实践 第二章
前端·javascript·vue.js
毕设源码-赖学姐3 小时前
【开题答辩全过程】以 基于Vue的电商管理平台为例,包含答辩的问题和答案
前端·javascript·vue.js