[译] React v16.8: 含有Hooks的版本

news/2024/7/5 5:23:38 标签: javascript, 测试
原文出处: React v16.8: The One With Hooks
February 06, 2019 by Dan Abramov

伴随 React 16.8,React Hooks可以在稳定版本中使用!


什么是 Hooks?

Hooks 可以让我们不用写一个 class 就能使用 state 和其他的 React 特性。我们也可以构建我们自己的 Hooks 来在组件之间共享可重复使用的有状态逻辑。
如果您之前从未听说 Hooks,您可能对下列这些资源感兴趣:

  • Hooks 介绍解释了我们向 React 添加 Hooks 的原因。
  • Hooks 概览 是一个对内置 Hookks 的快速概览。
  • 构建自己的 Hooks演示了使用自定义 Hooks 来复用代码。
  • 理解 React Hooks探索了通过解锁 Hooks 带来的新的可能。
  • useHooks.com展示了社区维护的 Hooks 指导手册和演示示例。

您现在没必要一定要学习 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 或者更高版本。 如果忘记升级,不能使用 Hooks,比如 React DOM。

React Native 将会在 0.59 发布版本中得到支持。
_

工具支持

React DevTools 目前支持 React Hooks。在最新的 Flow 和 TypeScript 对 React 的定义中也同样支持。我们强烈建议使用一条名为 eslint-plugin-react-hooks 的新检查规则,来强制实现 Hooks 的最佳实践。很快它也会默认包含进 Create React App 中。
_

下一步呢?

我们已经在最近发布的 React Roadmap 中,描述了我们接下来几个月的计划。

请注意 React Hooks 还没有涵盖 class 的所有用例,但是差不多了快完成了。

目前,只有 getSnapshotBeforeUpdate()componentDidCatch() 这俩方法没有相对应的 Hooks API,而且它们的生命周期相对来说比较特殊少见。如果您需要,您应该可以在您写的大多数新代码中使用 Hooks。

尽管 Hooks 还处于初步阶段,React 社区已经使用 Hooks 为动画、表单、订阅、与其他库集成等方面,创作了很多有意思的示例和指南手册。Hooks 使得代码复用更加简单,帮助我们用更加简洁的方式写出组件,以提供更好的用户体验,这让我们感到很兴奋。我们等不及要看到您下一次的创作!
_

测试 Hooks

我们在发布版中添加了一个名为 ReactTestUtils.act() 的新 API。它可以确保测试中的行为与浏览器中的行为更紧密地匹配。我们建议将任何渲染和触发组件更新的代码包装进 act() 调用。测试库也可以用它包装它们的API(例如,react-testing-library 的 renderfireEvent 实用工具就是这样做的)。

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

import React from 'react';
import ReactDOM from 'react-dom';
import { act } from 'react-dom/test-utils';
import Counter from './Counter';

let container;

beforeEach(() => {
  container = document.createElement('div');
  document.body.appendChild(container);
});

afterEach(() => {
  document.body.removeChild(container);
  container = null;
});

it('can render and update a counter', () => {
  // Test first render and effect
  act(() => {
    ReactDOM.render(<Counter />, container);
  });
  const button = container.querySelector('button');
  const label = container.querySelector('p');
  expect(label.textContent).toBe('You clicked 0 times');
  expect(document.title).toBe('You clicked 0 times');

  // Test second render and effect
  act(() => {
    button.dispatchEvent(new MouseEvent('click', {bubbles: true}));
  });
  expect(label.textContent).toBe('You clicked 1 times');
  expect(document.title).toBe('You clicked 1 times');
});

如果打算测试自定义的 Hooks,可以通过在测试中创建一个组件并使用它的 Hook 来实现,然后您就可以测试您写的 Hooks 了。

为了减少样板,建议使用 react-testing-library 来进行测试,该库是为鼓励编写测试用例而设计的。
_

感谢

感谢所有在 Hooks RFC 中进行评论来分享自己的反馈信息的同学。我们已经阅读了你们的所有评论意见,并在其基础上为最终的 API 做了些许调整。
_

安装

React

React v16.8.0 在 npm 上已可以使用。

使用 Yarn 来安装 React 16,运行命令:

yarn add react@^16.8.0 react-dom@^16.8.0

使用 npm 来安装 React 16,运行命令:

npm install --save react@^16.8.0 react-dom@^16.8.0

同时也通过 CDN 提供React 的 UMD 构建版本:

<script crossorigin src="https://unpkg.com/react@16/umd/react.production.min.js"></script>
<script crossorigin src="https://unpkg.com/react-dom@16/umd/react-dom.production.min.js"></script>

有关详细安装说明,请参阅文档。

用于 React Hooks 的 ESLint 插件

注意:
如上所述,强烈建议您使用 eslint-plugin-react-hooks 规则。
如果正在使用 Create React App,而不是手动配置 ESLint,建议等待下一个版本的 react-scripts,即将发布并且会包含这条规则。

假定您已经安装过了 ESLint,运行命令:

# npm
npm install eslint-plugin-react-hooks@next --save-dev

# yarn
yarn add eslint-plugin-react-hooks@next --dev

然后,添加下面的内容到 ESLint 配置中:

{
  "plugins": [
    // ...
    "react-hooks"
  ],
  "rules": {
    // ...
    "react-hooks/rules-of-hooks": "error"
  }
}

http://www.niftyadmin.cn/n/1556621.html

相关文章

热门前端面试题

一、HTML篇 1.块级元素的显示与隐藏方法&#xff0c;最少3种并说明区别 Display、visibility、opacity display设置为none&#xff0c;并不占据屏幕的空间&#xff0c;通过visibility和opacity设置隐藏时, 占据了屏幕页面的空间。 2.html的核心属性有哪些&#xff0c;并说明 i…

springboot swagger 整合

Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。 文件的方法&#xff0c;参数和模型紧密集成到服务器端的代码&#xff0c;允许API来始终保持同步。 作用&#xff1a; 1. 接口的文档在线自动生成。 2. 功能测试。 1.添加po…

深入解析JS的宏任务和微任务

1、关于javascript javascript是一门单线程语言&#xff0c;换而言之&#xff0c;在一段时间内&#xff0c;js只会做一件事&#xff0c;只有等这件事做完了&#xff0c;才会去做另外的事。但是任务分大小&#xff0c;分轻重缓急&#xff0c;如何能提高整体的效率是我们要思考的…

JavaScript 创建对象 (构造函数模式、对象字面量模式、工厂模式、原型模式、组合使用构造函数模式与原型模式)

一、构造函数模式 let p new Object(); p.name Tom; p.age 18; p.setName function (name){this.name name } p.setName(Jack); console.log(p.name,p.age);套路&#xff1a;先创建空Object对象&#xff0c;再动态添加属性/方法 适用场景&#xff1a;起始时不确定对象内部…

Java虚拟机(四)--垃圾回收

垃圾回收 java基于内存的动态分配&#xff0c;回收也是自动且动态回收。 因java程序计数器、虚拟机栈、本地方法栈均伴随线程产生而产生&#xff0c;线程销毁而销毁。栈帧的内存基本是类加载后确定的&#xff0c;大多不考虑这部分的内存回收。 而java堆以及方法区不同的是&…

改变函数内this指向的方法

1、call() 写法&#xff1a;fun.call(thisArg,arg1,arg2…) 作用&#xff1a;可以调用函数&#xff0c;还可以改变函数内的this指向 let o {name:andy, } function fn (a,b) {console.log(this);console.log(a b); } fn.call(o,1,2); // call的主要作用可以实现继承 function…

「每日一瞥

用 React Hooks 写异步表单校验React Hooks vs HOC 性能对比探讨Flexbox vs Gridgit-history 把玩一个 React 优化模式用 React Hooks 写异步表单校验 春节期间&#xff0c;React 发布了 16.8 的版本&#xff0c;正式支持了 React Hooks。本文将使用 React Hooks API 通过 100 …

JS数组的常用10种方法详解

1、arr.push() 作用&#xff1a;将一个或多个元素添加到数组的末尾&#xff0c;并返回该数组的新长度。 参数&#xff1a;被添加到数组末尾的元素。 返回值&#xff1a;新的 length 属性值 var sports ["soccer", "baseball"]; var total sports.push(&q…