ReactJS 教程

ReactJS 主页 ReactJS 简介 ReactJS 路线图 ReactJS 下载安装和环境配置 ReactJS 功能 ReactJS 优势和缺点 ReactJS 架构 ReactJS 创建 React 应用程序 ReactJS JSX ReactJS 组件 ReactJS 嵌套组件 ReactJS 使用组件 ReactJS 集合组件 ReactJS 样式 ReactJS 属性 (props) ReactJS 使用属性创建组件 ReactJS props 验证 ReactJS 构造函数 ReactJS 组件生命周期 ReactJS 事件管理 ReactJS 创建事件感知组件 ReactJS Expense Manager 事件 ReactJS 状态管理 ReactJS 状态管理 API ReactJS 无状态组件 ReactJS Hooks 进行状态管理 ReactJS Hooks 的组件生命周期 ReactJS 布局组件 ReactJS 分页 ReactJS Material UI ReactJS Http 客户端编程 ReactJS 表单编程 ReactJS 受控组件 ReactJS 非受控组件 ReactJS Formik ReactJS 条件渲染 ReactJS 列表 ReactJS Key 键 ReactJS 路由 ReactJS Redux ReactJS 动画 ReactJS Bootstrap ReactJS Map ReactJS 表格 ReactJS 使用 Flux 管理状态 ReactJS 测试 ReactJS CLI 命令 ReactJS 构建和部署 ReactJS 示例

Hooks

ReactJS Hooks 简介 ReactJS 使用 useState ReactJS 使用 useEffect ReactJS 使用 useContext ReactJS 使用 useRef ReactJS 使用 useReducer ReactJS 使用 useCallback ReactJS 使用 useMemo ReactJS 自定义 Hooks

ReactJS 高级

ReactJS 可访问性 ReactJS 代码拆分 ReactJS 上下文 ReactJS 错误边界 ReactJS 转发 Refs ReactJS 片段 ReactJS 高阶组件 ReactJS 与其他库集成 ReactJS 优化性能 ReactJS Profiler API ReactJS Portals ReactJS 不使用 ES6 ECMAScript ReactJS 不使用 JSX 的 React ReactJS Reconciliation ReactJS Refs 和 DOM ReactJS 渲染道具 ReactJS 静态类型检查 ReactJS 严格模式 ReactJS Web 组件

其他概念

ReactJS 日期选择器 ReactJS Helmet ReactJS 内联样式 ReactJS PropTypes ReactJS BrowserRouter ReactJS DOM ReactJS 轮播 ReactJS 图标 ReactJS 表单组件 ReactJS 参考 API

ReactJS 有用资源

ReactJS 快速指南 ReactJS 备忘录 Axios 备忘录 ReactJS 有用资源 ReactJS 讨论


ReactJS - Hooks 简介

在 React 16.8 之前,函数组件只是无状态组件。要向组件添加状态,我们需要将函数组件转换为基于类的组件。此外,函数组件没有操纵组件生命周期事件的选项。为了在函数组件中启用状态和生命周期事件,React 引入了一个名为 Hooks 的新概念。

Hooks 是普通的 JavaScript 函数,可以访问使用/应用它的组件的状态和生命周期事件。一般来说, Hooks 以 use 关键字开头。React 带有一些内置 Hooks ,也允许创建自定义 Hooks 。

内置 Hooks

让我们知道 React 中可用的 Hooks 列表及其基本用法。

  • useState −用于操作组件的状态。

  • useReducer − useState 的高级版本,带有 Reducer 概念。

  • useEffect − 用于挂接到组件的生命周期。

  • useLayoutEffect − 与 useEffect 类似,但在所有 DOM 变异之后或 DOM 即将在屏幕上绘制之前同步触发。

  • useContext − 提供对组件内部上下文提供程序的访问。

  • useMemo − 用于返回变量/函数的记忆版本,该版本仅根据提供的预定义依赖项集进行更改。这将减少昂贵计算的重新计算次数并提高应用程序的性能。

  • useCallback − 返回回调函数的记忆版本,该版本仅根据提供的预定义依赖项集进行更改。

  • useRef − 基于 React ref 对象提供对原始 DOM 节点的访问。

  • useImperativeHandle − 用于将子组件中基于 ref 的值公开给父组件。

  • useDeferredValue − 用于推迟类似于防抖或节流的值以推迟更新。

  • useDebug −用于在 React DevTools 中显示自定义 Hooks 的标签。

  • useTransition − 用于标识转换的待处理状态。

  • useId −用于为应用程序中的元素创建唯一 ID。

应用 Hooks

让我们通过创建应用程序来学习如何在函数组件中使用 Hooks 。

使用 create-react-app 创建 React 应用程序并使用以下命令启动该应用程序

create-react-app myapp
cd myapp
npm start

接下来,让我们创建一个新的函数组件 HelloWorld (src/components/HelloWorld.js),它呈现一个输入元素并根据用户输入到输入元素中的数据呈现问候消息。

import { useState } from 'react';
export default function HelloWorld() {
   const [name, setName] = useState("World")
   return (
      <div style={{ textAlign: "center", padding: "5px" }}>
         <input id="name" name="name"
            value={name}
            onChange={(e) => setName(e.target.value)} />
         <div>Hello {name}</div>
      </div>
   )
}

此处,

  • useState 是一个 Hooks ,它接收一个初始值并返回一个状态和一个用于更新状态的函数。它接收 World 作为初始值并返回一个包含两个项目的数组,a) 状态的初始值 (name) 和 b) 用于更新状态的函数 (setName)。使用的语法是数组破坏语法,用于获取数组值并将其设置为 name 和 setName 变量。

  • input 是一个带有 onChange 事件的反应输入元素。 onchange 事件通过 event.target.value 获取用户的更新值,并使用 setName 函数将其设置为当前状态。

  • 每当用户更新输入时,onchange 事件就会触发并更新状态,进而触发组件的渲染函数。

接下来,让我们在我们的应用程序 (App.js) 中应用我们的组件,如下所示 −

import './App.css';
import HelloWorld from './components/HelloWorld';
function App() {
   return (
      <HelloWorld />
   );
}
export default App;

最后,打开浏览器并通过更改输入值来检查结果。只要输入发生变化,消息就会更新,如下所示 −

应用 Hooks

Hooks 的优势

与 Hooks 一起使用时,函数组件比基于类的组件具有许多优势。它们如下 −

  • Hooks 易于理解,并且可以快速开始编码。

  • 在大型应用程序中,应用程序的复杂性可以保持在最低水平。在基于类的组件中,复杂性(状态管理和处理生命周期事件)会随着项目的增长而增长。

  • this 对于 JavaScript 编程初学者来说很难理解类(组件)中的 this。由于函数组件和 Hooks 不依赖于此,开发人员可以快速开始使用 React 进行编码,而无需陡峭的学习曲线。

  • 状态逻辑可以在组件之间轻松重用。

  • 函数组件可以与基于类的组件一起使用,这使得它很容易在任何规模的现有项目中采用。

  • 与基于类的组件相比,函数组件只需几行代码即可编写。

Hooks 的缺点

Hooks 是创建组件的替代方法,它也有自己的缺点。它们如下 −

  • Hooks 应该只在顶层调用,并且应该避免在条件、循环或嵌套函数中使用。

  • Hooks 是专门的功能,它们可能不是最适合某些情况,我们可能必须恢复到基于类的组件。

  • React 处理 hooks 的内部结构,而不暴露核心进行优化,这使得它不太灵活,不适合某些场景。

摘要

Hooks 是一种相对较新的创建组件的方式。大量项目仍在使用基于类的组件。将这些项目中的组件从基于类转换为基于函数在实践中是不可能的,我们必须接受它。相反,我们可以分阶段转换应用程序。