讲师中心 微信公众号
AI工具推荐 视频效率加速

React 综合指南

夜涛姑娘_5412

夜涛姑娘_5412

发布时间:2024-08-07 14:03:12

|

1259人浏览过

|

来源于dev.to

转载

react 综合指南

react 19 来了! ? 在本文中,我们将探索 react 19 中的新功能和改进。让我们开始吧!

react 19 的新增功能

react 19 是 react 团队的最新主要版本,具有多项突破性功能和增强功能,旨在使开发过程更加高效,并使生成的应用程序更快、更强大。该版本继续建立在其前身奠定的坚实基础上,对核心框架进行了重大更新。在这篇博客中,我们将探索 react 19 的主要功能,包括新的 react 编译器、服务器组件和服务器操作、新的钩子和 api 等等!

反应编译器

react 19 中最令人兴奋的功能之一是新的 react 编译器,也称为 react fizz。该编译器旨在通过生成高效的 javascript 代码来优化 react 应用程序的性能。 react 编译器将您的 jsx 和 javascript 代码转换为高度优化的 javascript,可以更快地执行、更好的内存使用和更少的开销。这仍处于实验模式,但它是一个很有前途的功能,可能会改变 react 开发人员的游戏规则。它使用纯 javascript,并理解 react 规则,因此您无需重写任何代码即可使用它。

编译器是做什么的?

为了优化应用程序,react compiler 自动记忆组件和钩子,并且还优化了渲染过程。这意味着react只会重新渲染实际发生变化的组件,而不是重新渲染整个组件树。这可以带来显着的性能提升,特别是对于大型和复杂的应用程序。

如果您的代码库已经被很好地记住了,您可能不会期望看到编译器的重大性能改进。然而,在实践中,手动记住导致性能问题的正确依赖关系是很棘手的。编译器可以帮助你。

编译器假设什么?

react 编译器假设你的代码:

  • 是有效的、语义的 javascript
  • 在访问可空/可选值和属性之前测试它们是否已定义(例如,如果使用 typescript,则通过启用 strictnullchecks),即 if (object.nullableproperty) { object.nullableproperty.foo } 或使用可选链接 object.nullableproperty? .foo
  • 遵循 react 规则

react compiler 可以静态验证 react 的许多规则,并在检测到错误时安全地跳过编译。

服务器组件和服务器操作

服务器组件可以在构建时运行以从文件系统读取或获取静态内容,因此不需要 web 服务器。例如,您可能想从内容管理系统读取静态数据。

没有服务器的服务器组件

没有服务器组件,在客户端获取静态数据很常见,效果如下:

// bundle.js
import marked from 'marked'; // 35.9k (11.2k gzipped)
import sanitizehtml from 'sanitize-html'; // 206k (63.3k gzipped)

function page({page}) {
  const [content, setcontent] = usestate('');
  // note: loads *after* first page render.
  useeffect(() => {
    fetch(`/api/content/${page}`).then((data) => {
      setcontent(data.content);
    });
  }, [page]);

  return <div>{sanitizehtml(marked(content))}</div>;
}

使用服务器组件,您可以在构建时获取静态数据:

import marked from 'marked'; // not included in bundle
import sanitizehtml from 'sanitize-html'; // not included in bundle

async function page({page}) {
  // note: loads *during* render, when the app is built.
  const content = await file.readfile(`${page}.md`);

  return <div>{sanitizehtml(marked(content))}</div>;
}

渲染的输出可以被缓存并静态提供,因此服务器不需要运行任何 javascript。这对于性能来说是一个巨大的胜利,尤其是在移动设备上。当应用程序加载时,它可以立即显示内容,无需等待网络请求。

带有服务器的服务器组件

服务器组件也可以在服务器上运行。这对于获取非静态数据非常有用,例如特定于用户的数据或经常更改的数据。例如,您可能想从数据库中获取特定于用户的数据,这通常是通过使用 useeffect 挂钩来实现的:

// bundle.js
function note({id}) {
  const [note, setnote] = usestate('');
  // note: loads *after* first render.
  useeffect(() => {
    fetch(`/api/notes/${id}`).then(data => {
      setnote(data.note);
    });
  }, [id]);

  return (
    <div>
      <author id={note.authorid} />
      <p>{note}</p>
    </div>
  );
}

function author({id}) {
  const [author, setauthor] = usestate('');
  // note: loads *after* note renders.
  // causing an expensive client-server waterfall.
  useeffect(() => {
    fetch(`/api/authors/${id}`).then(data => {
      setauthor(data.author);
    });
  }, [id]);

  return <span>by: {author.name}</span>;
}

使用服务器组件,您可以读取数据并在组件中渲染:

import db from './database';

async function note({id}) {
  // note: loads *during* render.
  const note = await db.notes.get(id);
  return (
    <div>
      <author id={note.authorid} />
      <p>{note}</p>
    </div>
  );
}

async function author({id}) {
  // note: loads *after* note,
  // but is fast if data is co-located.
  const author = await db.authors.get(id);
  return <span>by: {author.name}</span>;
}

服务器组件可以通过从服务器重新获取它们来动态化,它们可以在服务器上访问数据并再次渲染。这种新的应用程序架构结合了以服务器为中心的多页面应用程序的简单“请求/响应”心理模型与以客户端为中心的单页应用程序的无缝交互性,为您提供两全其美的优势。

服务器操作

当使用“use server”指令定义服务器操作时,您的框架将自动创建对服务器函数的引用,并将该引用传递给客户端组件。当客户端调用该函数时,react 会向服务器发送请求来执行该函数,并返回结果。

服务器操作可以在服务器组件中创建并作为道具传递给客户端组件,也可以在客户端组件中导入和使用。

从服务器组件创建服务器操作:

// server component
import button from './button';

function emptynote () {
  async function createnoteaction() {
    // server action
    'use server';

    await db.notes.create();
  }

  return <button onclick={createnoteaction}/>;
}

当 react 渲染 emptynote 服务器组件时,它将创建对 createnoteaction 函数的引用,并将该引用传递给 button 客户端组件。单击按钮时,react 将向服务器发送请求以执行 createnoteaction 函数,并提供参考:

"use client";

export default function button({onclick}) { 
  console.log(onclick); 
  return <button onclick={onclick}>create empty note</button>
}

在客户端组件中导入和使用服务器操作:

客户端组件可以从使用“use server”指令的文件导入服务器操作:

"use server";

export async function createnoteaction() {
  await db.notes.create();
}

当捆绑器构建 emptynote 客户端组件时,它将在捆绑包中创建对 createnoteaction 函数的引用。单击按钮时,react 将向服务器发送请求,以使用提供的引用执行 createnoteaction 函数:

"use client";
import {createnoteaction} from './actions';

function emptynote() {
  console.log(createnoteaction);
  // {$$typeof: symbol.for("react.server.reference"), $$id: 'createnoteaction'}
  <button onclick={createnoteaction} />
}

新的 hook 和 api

除了 react 编译器和服务器组件之外,react 19 还引入了几个新的钩子和 api,可以更轻松地构建复杂的应用程序。

使用乐观

useoptimistic 钩子允许您在服务器响应之前乐观地更新 ui。这可以让您的应用程序感觉更具响应性并减少感知的延迟。该钩子采用执行乐观更新的回调函数,以及指定乐观更新后要发送的服务器请求的可选配置对象。

使用表单状态

useformstatus 钩子允许您跟踪表单的状态,例如它是原始的、脏的、有效的还是无效的。这对于向用户显示反馈非常有用,例如错误消息或成功消息。

使用表单状态

useformstate 钩子允许您管理表单的状态,例如表单字段的值和表单的有效性。这对于构建具有动态验证逻辑的复杂表单非常有用。

这个钩子需要两个参数:初始表单状态和验证函数。验证函数将表单状态作为输入,并返回一个包含每个表单字段有效性的对象。

新使用api

react 19 引入了一种新的使用 api,它是从 promises 或上下文等资源中读取值的通用方法。 use api 与 useeffect 挂钩类似,但它不采用回调函数。相反,它返回资源的值,并在值发生变化时重新渲染组件。

const value = use(resource);

示例:

import { use } from 'react';

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

结论 - 你应该升级到 react 19 吗?

react 19 是一个主要版本,为核心框架引入了多项突破性功能和增强功能。新的 react 编译器、服务器组件和服务器操作旨在使开发过程更加高效,并使生成的应用程序更快、更强大。新的挂钩和 api 可以更轻松地构建复杂的应用程序并改善用户体验。如果您已经在使用 react,那么升级到 react 19 绝对值得考虑。

但同时需要注意的是,react 19 仍处于实验模式,某些功能可能会在最终发布之前发生变化。建议在升级之前在非生产环境中使用 react 19 测试您的应用程序。如果您要开始一个新项目,react 19 是一个不错的选择,因为它为构建现代 web 应用程序提供了坚实的基础。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

252

2026.02.13

TypeScript全栈项目架构与接口规范设计
TypeScript全栈项目架构与接口规范设计

本专题面向全栈开发者,系统讲解基于 TypeScript 构建前后端统一技术栈的工程化实践。内容涵盖项目分层设计、接口协议规范、类型共享机制、错误码体系设计、接口自动化生成与文档维护方案。通过完整项目示例,帮助开发者构建结构清晰、类型安全、易维护的现代全栈应用架构。

480

2026.02.25

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

331

2026.03.13

TypeScript 全栈开发进阶指南
TypeScript 全栈开发进阶指南

面向有 JavaScript 基础的开发者,深入讲解 TypeScript 的类型系统与全栈开发实践。

246

2026.06.03

TypeScript Node.js 全栈工程化与Monorepo架构实践
TypeScript Node.js 全栈工程化与Monorepo架构实践

本专题围绕 TypeScript 在 Node.js 全栈开发中的工程化实践展开,系统讲解 Monorepo 架构设计、包管理策略、模块复用机制以及服务端与前端统一类型系统的构建方法。通过真实项目案例,帮助开发者提升大型全栈项目的可维护性与协作效率。

498

2026.06.16

java值传递和引用传递有什么区别
java值传递和引用传递有什么区别

java值传递和引用传递的区别:1、基本数据类型的传递;2、对象的传递;3、修改引用指向的情况。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

166

2024.02.23

go语言引用传递
go语言引用传递

本专题整合了go语言引用传递机制,想了解更多相关内容,请阅读专题下面的文章。

3457

2025.06.26

数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2345

2023.06.29

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn