专业编程教程与实战项目分享平台

网站首页 > 技术文章 正文

React 19 超强新特性,今天就来一探究竟吧(二)

ins518 2024-09-16 21:46:16 技术文章 21 ℃ 0 评论

上一篇文章我们介绍了相关的内容《React 19 超强新特性,今天就来一探究竟吧(一)》,今天我们继续介绍剩下的内容。

A New API — use

在React 19中,use被重新分类到了API中,从而成为一个新的API。use主要用于在组件中读取资源的值,这些资源可以是Promise或者是Context。

基本用法

import { use } from 'react';

function MessageComponent({ messagePromise }) {
  const message = use(messagePromise);
  const theme = use(ThemeContext);
  // …
}

这个API的设计初衷是为了更高层次的框架,如 Next.js。比如,在Next.js的服务端组件中进行数据获取时,推荐使用async...await而不是use。如果数据获取发生在客户端组件中,建议在服务端组件中创建 Promise 并将其作为 props 传递给客户端组件。

与Suspense边界一起使用

use还可以和Suspense边界一起使用。如果调用use的组件被包裹在一个Suspense边界内,那么在Promise解析之前,指定的回退UI将会显示。一旦Promise解析完成,回退UI会被返回的数据替代。如果Promise被拒绝,最近的错误边界的回退UI将会显示。

这种设计让开发者在处理异步数据时更加得心应手,尤其是在构建复杂的用户界面时。通过将use与Suspense结合使用,可以显著简化异步状态管理,提高代码的可读性和维护性。

简化的ref和context用法

如果你主要使用React的客户端功能,那么本节讨论的变化将会特别引起你的兴趣。

Ref舍弃了forwardRef

还记得被forwardRef支配的恐惧吗?在React 19中,我们终于可以舍弃forwardRef了。从现在开始,refs可以直接作为props传递。

例如,我们有一个函数组件TextInput,这是一个简单的输入框,可以接受一个placeholder属性用于占位符文本。现在,我们希望在父组件中获取这个输入框的引用,以便在需要时聚焦它。下面是如何实现的:

import React, { useRef } from 'react';

// 定义一个函数组件TextInput
function TextInput({ placeholder, ref }) {
  return <input placeholder={placeholder} ref={ref} />;
}

// 父组件
function ParentComponent() {
  // 创建一个ref来存储输入框的引用
  const inputRef = useRef(null);

  // 在某个事件处理器中,获取输入框的引用并聚焦它
  const focusInput = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      {/* 
        将inputRef传递给TextInput组件,
        允许在TextInput内部使用ref
      */}
      <TextInput placeholder="请输入你的名字" ref={inputRef} />
      <button onClick={focusInput}>聚焦输入框</button>
    </div>
  );
}

export default ParentComponent;

这样写是不是比使用forwardRef更加轻松了?

作为Provider的Context

从React 19开始,开发者可以直接使用<Context>作为provider,而不再需要使用<Context.Provider>。

假设我们有一个ThemeContext用于管理主题信息。在React 19中,我们可以像这样使用<ThemeContext>作为provider:

import React, { createContext } from 'react';

// 创建一个主题context
const ThemeContext = createContext('');

// 作为主题provider的App组件
function App({ children }) {
  return (
    <ThemeContext value="dark">
      {children}
    </ThemeContext>
  );
}

未来,Context.Provider将被弃用并移除。

其他更新

这个版本还包含了各种支持性功能和对服务器端能力的增强,尽管这些功能在纯客户端React开发中不常用,因此我们简要总结如下:

服务器组件和服务器动作

服务器组件和服务器动作正在成为稳定功能。这些概念对于熟悉Next.js/Remix的开发者来说已经耳熟能详,但对于不使用这些框架的开发者来说则不太常见。

useDeferredValue更新

useDeferredValue已更新,增加了第二个参数,用于可选地指定初始值。新的用法如下:

const value = useDeferredValue(deferredValue, initialValue?);

直接在React代码中编写文档元数据

现在可以直接在React代码中编写文档元数据,即在页面组件中编写<title>、<link>和<meta>标签时,它们会自动添加到应用的<head>中:

function BlogPost({ post }) {
  return (
    <article>
      <h1>{post.title}</h1>
      <title>{post.title}</title>
      <meta name="author" content="Josh" />
      <link rel="author" href="https://twitter.com/joshcstory/" />
      <meta name="keywords" content={post.keywords} />
      <p>
        Eee equals em-see-squared...
      </p>
    </article>
  );
}

直接在React代码中编写样式表

同样地,现在也支持在React代码中直接编写样式表标签,即<link rel="stylesheet" href="...">标签会自动添加到<head>中。

直接在React代码中编写脚本标签

支持编写<script async="" src="...">标签,这些标签也会自动添加到<head>中。

资源预加载支持

支持资源预加载,这些预加载的资源也会自动添加到<head>中:

import { prefetchDNS, preconnect, preload, preinit } from 'react-dom';

function MyComponent() {
  preinit('https://.../path/to/some/script.js', { as: 'script' }); // 立即加载并执行此脚本
  preload('https://.../path/to/font.woff', { as: 'font' }); // 预加载此字体
  preload('https://.../path/to/stylesheet.css', { as: 'style' }); // 预加载此样式表
  prefetchDNS('https://...'); // 当你可能不会实际请求来自此主机的任何内容时
  preconnect('https://...'); // 当你将请求某些内容但不确定具体是什么时
}

总结

React 19不仅在客户端开发方面带来了便利,还增强了服务器端功能。这些新功能使得在React代码中编写文档元数据、样式表、脚本和预加载资源变得更加简单和直观,进一步提升了开发体验。

对于那些希望充分利用React 19新功能的开发者,掌握这些更新内容将是非常有帮助的。让我们一起期待React带来的更多创新和改进吧!

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表