React 16.8 版本: 带 Hooks 的版本

简介: Hooks 允许你在不编写 class 的情况下使用状态(state)和其他 React 特性。 你还可以构建自己的 Hooks, 跨组件共享可重用的有状态逻辑。

原文作者:Dan Abramov

译者:UC 国际研发 Jothy

写在最前:欢迎你来到“UC国际技术”公众号,我们将为大家提供与客户端、服务端、算法、测试、数据、前端等相关的高质量技术文章,不限于原创与翻译。

编者按:英文原文带有大量外链,由于微信的限制不能很好展示,您可选择「阅读原文」获得更好的阅读体验。:-)

随着 React 发布 16.8 版本,React Hooks 也发布稳定版本啦!

什么是 Hooks?
Hooks 允许你在不编写 class 的情况下使用状态(state)和其他 React 特性。 你还可以构建自己的 Hooks, 跨组件共享可重用的有状态逻辑。

如果你以前从未听说过 Hooks, 你可能会觉得这些资源很有趣:

  • Hooks 介绍 解释了我们给 React 添加 Hooks 的原因。
  • Hooks 概览 是对内置 Hooks 的快速概述。
  • 构建自己的 Hooks 演示了如何使用自定义 Hooks 重用代码。
  • 理解 React Hooks 探索了那些被 Hooks 解锁的新的可能。
  • useHooks.com 展示了由社区维护的 Hooks 用法和 demos.

你不必现在就学习 Hooks. Hooks 没有重大变化,我们不计划从 React 中移除 class. Hooks FAQ 描述了我们逐步采纳的策略。

无重大重写
我们不建议你为了马上应用 Hooks 而重写现有应用。相反,我们建议你尝试在一些新的组件中使用 Hooks, 并且让我们了解你的想法。 使用 Hooks 的代码将与使用 class 的现有代码并行工作。

我现在可以用 Hooks 了吗?
可以的! 从 16.8.0 版本开始,React 包含一个稳定的 React Hooks 实现,可用于:

  • React DOM
  • React DOM 服务器(Server)
  • React 测试渲染器(Test Renderer)
  • React 浅层渲染器(Shallow Renderer)

请注意,要启用 Hooks, 所有 React 包都必须升级到 16.8.0 或更高版本。 如果你忘记更新诸如 React DOM 之类的包,Hooks 将无法运行。

React Native 将在 0.59 版本 支持 Hooks.

工具支持
React DevTools 现已支持 React Hooks, React 最新的 Flow 和 TypeScript 定义也支持它们。我们强烈建议你启用名为 eslint-plugin-react-hooks 的新 lint 规则来强制执行 Hooks 的最佳实践。Create React App 将很快包含它。

规划
我们在最近发布的 React 路线图中描述了我们未来几个月的计划。

请注意,React Hooks 尚未涵盖所有 class 的用例,但已经很接近了。 目前,只有 getSnapshotBeforeUpdate() 和 componentDidCatch() 方法没有等价的 Hooks API, 且这些生命周期相对不常见。 如果你想用 Hooks, 你可以在你正在写的大部分新代码中使用它。

即使仍处于 alpha 状态,React 社区也使用 Hooks 为动画(animations),表单(forms),订阅(subscriptions),与其他库的集成(integrating)等创建了许多有趣的示例和用法。 我们为 Hooks 而雀跃 ,因为它们使代码更易重用,帮助你以更简单的方式编写组件,创建绝佳的用户体验。 我们迫不及待想知道你接下来会创造什么!

测试 Hooks
我们在这个版本中添加了一个名为 ReactTestUtils.act() 的新 API. 它可确保测试的行为与浏览器中的行为更加匹配。我们建议将所有代码渲染和组件更新触发封装到 act() 调用中。测试库也可以用它封装 API(举个例子,react-testing-library 的 render 和 fireEvent 工具就是这样做的)。

例如,此页面中的计数器示例可以这样进行测试:

image.png

对 act() 的调用也会刷新它们内部的 effects.

如果你需要测试自定义 Hook, 你可以在测试时创建组件,并使用它的 Hook. 然后就可以测试你写的组件了。

为了减少重复样板,我们建议使用 react-testing-library, 它鼓励程序员编写模拟用户使用组件的行为的测试。

致谢
我们想向所有在 Hooks RFC 中分享反馈意见的人致谢。 我们已经阅读了你们的所有评论,并根据它们对最终 API 进行了一些调整。

安装
React {#react}
React 16.8.0 版本已发布到 NPM 注册表。

使用 Yarn 安装 React 16, 请运行:

image.png

使用 NPM 安装 React 16, 请运行:

image.png

我们还通过 CDN 提供 React 的 UMD 构建版本:

image.png

详情请访问详细的安装。

React Hooks 的 ESLint 插件
注意

综上所述,我们强烈建议你使用 eslint-plugin-react-hooks lint 规则。
如果你正在使用 Create React App, 而不是手动配置 ESLint,你可以等待下一版本的 react-scripts, 届时将包含此规则。

假设你已经安装了 ESLint, 请运行:

image.png

然后添加以下 ESLint 配置:

image.png

更新日志
React {#react-1}

  • 新增 Hooks —— 一种在不编写 class 的情况下使用状态(state)和其他 React 特性的方法。(@acdlite 等人提出于 #13968)
  • 改进 useReducer Hook 延迟初始化 API. (@acdlite 提出于 #14723)

React DOM {#react-dom}

  • 避免为 useState 和 useReducer Hooks 传入相同值时进行的渲染。 (@acdlite 提出于 #14569)
  • 不比较传递给 useEffect/useMemo/useCallback Hooks 的第一个参数。 (@gaearon 提出于 #14654)
  • 使用 Object.is 算法比较 useState 和 useReducer 的值。 (@Jessidhia 提出于 #14752)
  • 支持传递给 React.lazy() 的同步 thenable. (@gaearon 提出于 #14626)
  • 在严格模式(仅限 DEV)中使用 Hooks 两次渲染组件以匹配 class 行为。 (@gaearon 提出于 #14654)
  • 在开发模式中 Hook 顺序不匹配时警告。 (@threepointone 提出于 #14585 及 @acdlite 提出于 #14591)

Effect 清理功能必须返回 undefined 或函数。不允许包含 null 在内的其他所有值。(@acdlite 提出于 #14119)

React 测试渲染器

  • 支持浅层渲染器中的 Hooks. (@trueadm 提出于 #14567)
  • 在浅层渲染器中存在 getDerivedStateFromProps 的情况下,修复 shouldComponentUpdate 中的错误状态。 (@chenesan 提出于 #14613)
  • 添加 ReactTestRenderer.act() 和 ReactTestUtils.act() 以进行批处理更新,以便测试更接近真实行为。 (@threepointone 提出于 #14744)

ESLint 插件: React Hooks {#eslint-plugin-react-hooks}

  • 首次发布。 (@calebmer 提出于 #13968)
  • 修复循环后的报告。 (@calebmer 及 @Yurickh 提出于 #14661)
  • 不要把错误的抛出当作违反规则。 (@sophiebits 提出于 #14040)

Hooks 自 Alpha 版本之后的更新日志 {#hooks-changelog-since-alpha-versions}
上述更改日志包含自上次稳定版本(16.7.0)以来的所有重要更改。 与我们的所有 minor 版本一样,这些更改都不会破坏向后兼容性。

如果你正在使用来自 React alpha 版本的 Hooks, 请注意此版本确实包含对 Hooks 的一些小的重大更改。 我们不建议在生产代码中依赖 alpha. 我们发布它们是为了在 API 稳定之前根据的社区反馈进行更改。

以下是自第一个 alpha 版本发布以来,我们对 Hooks 所做的所有重大更改:

  • 删除 useMutationEffect. (@sophiebits 提出于 #14336)
  • 将 useImperativeMethods 重命名为 useImperativeHandle. (@threepointone 提出于 #14565)
  • 避免为 useState 和 useReducer Hooks 传入相同值时进行的渲染。 (@acdlite 提出于 #14569)
  • 不比较传递给 useEffect/useMemo/useCallback Hooks 的第一个参数。 (@gaearon 提出于 #14654)
  • 使用 Object.is 算法比较 useState 和 useReducer 的值。 (@Jessidhia 提出于 #14752)
  • 在严格模式下仅使用 Hooks 两次渲染组件(仅限 DEV)。 (@gaearon 提出于 #14654)
  • 改进 useReducer Hook 延迟初始化 API. (@acdlite 提出于 #14723)
目录
相关文章
|
2天前
|
前端开发 JavaScript
深入理解并实践React Hooks —— useEffect与useState
深入理解并实践React Hooks —— useEffect与useState
10 1
|
18天前
|
JavaScript 前端开发 安全
[译] 使用 TypeScript 开发 React Hooks
[译] 使用 TypeScript 开发 React Hooks
|
19天前
|
前端开发 JavaScript API
React Hooks 的使用场景有哪些?
【8月更文挑战第25天】
34 2
|
20天前
|
存储 前端开发 JavaScript
React Hooks的魔法:如何在组件世界里施展响应式与复用的魔法
【8月更文挑战第27天】React Hooks 是自 React 16.8 起新增的功能,支持开发者在无需类组件的情况下利用 React 的状态管理和特性。本文通过实例展示了多种核心 Hooks 的使用方法:`useState` 用于实现响应式状态管理;`useEffect` 处理副作用操作,如数据获取等;`useMemo` 和 `useCallback` 有助于性能优化;`useRef` 则提供对 DOM 的直接引用。
27 2
|
2天前
|
前端开发 JavaScript
react hooks深拷贝后无法保留视图状态
react hooks深拷贝后无法保留视图状态
6 0
|
16天前
|
前端开发 开发者 UED
数据校验的艺术:揭秘JSF如何将前端与后端验证合二为一,打造无缝用户体验
【8月更文挑战第31天】JavaServer Faces(JSF)是构建企业级Web应用的Java规范,提供了丰富的组件和API,便于快速搭建用户界面。JSF验证框架基于JavaBean验证API(JSR 303/JSR 380),利用注解如`@NotNull`、`@Size`等在模型类上定义验证规则,结合前端的`<h:inputText>`和`<h:message>`标签展示错误信息。
22 0
|
16天前
|
容器 Kubernetes Docker
云原生JSF:在Kubernetes的星辰大海中,让JSF应用乘风破浪!
【8月更文挑战第31天】在本指南中,您将学会如何在Kubernetes上部署JavaServer Faces (JSF)应用,享受容器化带来的灵活性与可扩展性。文章详细介绍了从构建Docker镜像到配置Kubernetes部署全流程,涵盖Dockerfile编写、Kubernetes资源配置及应用验证。通过这些步骤,您的JSF应用将充分利用Kubernetes的优势,实现自动化管理和高效运行,开启Java Web开发的新篇章。
31 0
|
16天前
|
前端开发 JavaScript API
掌握React表单管理的高级技巧:探索Hooks和Context API如何协同工作以简化状态管理与组件通信
【8月更文挑战第31天】在React中管理复杂的表单状态曾是一大挑战,传统上我们可能会依赖如Redux等状态管理库。然而,React Hooks和Context API的引入提供了一种更简洁高效的解决方案。本文将详细介绍如何利用Hooks和Context API来优化React应用中的表单状态管理,通过自定义Hook `useForm` 和 `FormContext` 实现状态的轻松共享与更新,使代码更清晰且易于维护,为开发者带来更高效的开发体验。
23 0
|
16天前
|
前端开发
【实战指南】React Hooks 详解超厉害!六个步骤带你提升 React 应用状态管理,快来探索!
【8月更文挑战第31天】React Hooks 是 React 16.8 推出的新特性,允许在函数组件中使用状态及其它功能而无需转换为类组件。通过以下六个步骤可有效提升 React 应用的状态管理:1)使用 `useState` Hook 添加状态;2)利用 `useEffect` Hook 执行副作用操作;3)在一个组件中结合多个 `useState` 管理不同状态;4)创建自定义 Hook 封装可重用逻辑;5)借助 `useContext` 访问上下文以简化数据传递;6)合理运用依赖项数组优化性能。React Hooks 为函数组件带来了更简洁的状态管理和副作用处理方式。
22 0
|
16天前
|
前端开发 JavaScript 测试技术
React Hooks vs. Class Components的奥秘:如何用新时代开发模式让你的项目一鸣惊人?
【8月更文挑战第31天】在现代Web开发中,React提供了两种主要的组件实现方式:Hooks和Class Components。React Hooks自16.8版本推出,允许开发者在不使用类的情况下访问状态和生命周期方法,提高了函数组件的功能性和开发效率。Class Components则基于JavaScript类,提供了丰富的生命周期方法,便于精细控制组件行为。尽管两者在代码组织、性能及开发效率上各有千秋,但随着Hooks的普及,前端开发模式正逐渐转变,Hooks因其实现简便性成为越来越多开发者的选择,而在需要细致管理生命周期的场景下,Class Components仍具优势。
21 0