【高级React技术】Hook在企业项目中的使用心得以及一些组件的原理(State Hook)

简介: 【高级React技术】Hook在企业项目中的使用心得以及一些组件的原理(State Hook)

Hook

完全可选。可以在某些组件中尝试Hook,而无需重写任何现有代码。但如果你不想,你现在就不必学习或使用Hook。

import React, { useState } from 'react';

function Example() {
  // 声明一个新的叫做 “count” 的 state 变量
  const [count, setCount] = useState(0);

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

100%向后兼容。钩子不包含任何破坏性更改。
现在可用。钩子已在v16.8.0中释放。
没有计划从React中删除该类。可以在本页底部的章节中阅读更多关于Hook的进步战略。
Hook不会影响对React概念的理解。相反,Hook为已知的React概念提供了更直接的API:props、state、context、refs和生命周期。正如我们稍后将看到的,Hook还提供了一种更强大的方式来组合它们。

如果不想知道添加Hook的具体原因,可以跳到下一章开始学习Hook!当然,也可以继续阅读本章以了解原因,并学习如何在不重写应用程序的情况下使用Hook。

function ExampleWithManyStates() {
  // 声明多个 state 变量!
  const [age, setAge] = useState(42);
  const [fruit, setFruit] = useState('banana');
  const [todos, setTodos] = useState([{ text: 'Learn Hooks' }]);
  // ...
}

我们经常维护一些组件。起初,组件很简单,但逐渐地,它们将充满状态逻辑和副作用。每个生命周期通常包含一些不相关的逻辑。例如,组件通常在componentDidMount和componentDidUpdate中获取数据。然而,相同的componentDidMount还可能包含许多其他逻辑,例如设置事件侦听,这需要稍后在componentWillUnmount中清除。相关且需要通过比较修改的代码被拆分,而完全不相关的代码以相同的方法组合。很容易产生错误并导致逻辑不一致。
使用浏览器的 API 更新页面标题

import React, { useState, useEffect } from 'react';

function Example() {
  const [count, setCount] = useState(0);
  useEffect(() => {
    document.title = `You clicked ${count} times`;
  });

  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}

在大多数情况下,不可能将组件分割成更小的粒度,因为状态逻辑无处不在。这也给测试带来了挑战。同时,这也是许多人将React与状态管理库一起使用的原因之一。然而,这通常会引入许多抽象概念,需要在不同的文件之间来回切换,从而使重用变得更加困难。
调用useEffect时,告诉React在完成对DOM的更改后运行“副作用”函数。因为副作用函数是在组件中声明的,所以它们可以访问组件的属性和状态。默认情况下,React在每次渲染(包括第一次渲染)后调用副作用函数。(我们将在使用Effect Hook时与类组件的生命周期方法进行更详细的比较。)

import React, { useState, useEffect } from 'react';

function FriendStatus(props) {
  const [isOnline, setIsOnline] = useState(null);

  function handleStatusChange(status) {
    setIsOnline(status.isOnline);
  }

  useEffect(() => {
    ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
    return () => {
      ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
    };
  });

  if (isOnline === null) {
    return 'Loading...';
  }
  return isOnline ? 'Online' : 'Offline';
}

副作用函数还可以指定如何通过返回函数来“清除”副作用。例如,使用以下组件中的副作用功能订阅朋友的在线状态,并取消订阅以清除该状态

State Hook

介绍React中的useStateHook。它允许我们在函数组件中存储内部状态。
在Example组件中,我们通过调用useStateHook来声明一个新的状态变量。它向命名变量返回一对值。我们将变量命名为count,因为它存储了点击次数。我们通过传递0作为唯一参数,将useState初始化为0。第二个返回值本身就是一个函数。它允许我们更新count的值,所以我们称它为setCount。

function ExampleWithManyStates() {
  // 声明多个 state 变量
  const [age, setAge] = useState(42);
  const [fruit, setFruit] = useState('banana');
  const [todos, setTodos] = useState([{ text: '学习 Hook' }]);

当用户单击按钮时,我们向setCount传递一个新值。React将重新渲染Example组件并将最新计数传递给它。

  function handleOrangeClick() {
    // 和 this.setState({ fruit: 'orange' }) 类似
    setFruit('orange');
  }

乍一看,这似乎太多了。不要急于求成!如果你不明白什么,请重新阅读上面的代码并从头到尾阅读。我们保证,一旦试图“忘记”状态在类中的工作方式,并以新的视角来看待这段代码,就会很容易理解。
不必使用多个状态变量。State变量可以很好地存储对象和数组,因此仍然可以将相关数据分组。然而,与SetState类中的情况不同。更新状态变量总是替换它,而不是合并它。

相关文章
|
26天前
|
前端开发 开发者
React 函数组件与类组件对比
【10月更文挑战第4天】本文详细比较了React中的函数组件与类组件。函数组件是一种简单的组件形式,以纯函数的形式返回JSX,易于理解与维护,适用于简单的UI逻辑。类组件则是基于ES6类实现的,需要重写`render`方法并能利用更多生命周期方法进行状态管理。文章通过示例代码展示了两者在状态管理与生命周期管理上的差异,并讨论了常见的问题如状态更新异步性与生命周期管理的复杂性,最后给出了相应的解决方法。通过学习,开发者可以根据具体需求选择合适的组件类型。
50 8
|
24天前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
125 2
|
2月前
|
前端开发 JavaScript 网络架构
react对antd中Select组件二次封装
本文介绍了如何在React中对Ant Design(antd)的Select组件进行二次封装,包括创建MSelect组件、定义默认属性、渲染Select组件,并展示了如何使用Less进行样式定义和如何在项目中使用封装后的Select组件。
74 2
react对antd中Select组件二次封装
|
5天前
|
前端开发 JavaScript 安全
学习如何为 React 组件编写测试:
学习如何为 React 组件编写测试:
15 2
|
11天前
|
前端开发 JavaScript 测试技术
React 高阶组件 (HOC) 应用
【10月更文挑战第16天】高阶组件(HOC)是 React 中一种复用组件逻辑的方式,通过接受一个组件并返回新组件来实现。本文介绍了 HOC 的基础概念、核心功能和常见问题,包括静态方法丢失、ref 丢失、多个 HOC 组合和 props 冲突的解决方案,并提供了具体的 React 代码示例。通过本文,读者可以更好地理解和应用 HOC,提高代码的复用性和可维护性。
34 8
|
11天前
|
缓存 前端开发 JavaScript
前端serverless探索之组件单独部署时,利用rxjs实现业务状态与vue-react-angular等框架的响应式状态映射
本文深入探讨了如何将RxJS与Vue、React、Angular三大前端框架进行集成,通过抽象出辅助方法`useRx`和`pushPipe`,实现跨框架的状态管理。具体介绍了各框架的响应式机制,展示了如何将RxJS的Observable对象转化为框架的响应式数据,并通过示例代码演示了使用方法。此外,还讨论了全局状态源与WebComponent的部署优化,以及一些实践中的改进点。这些方法不仅简化了异步编程,还提升了代码的可读性和可维护性。
|
23天前
|
前端开发 JavaScript 调度
React 组件状态(State)
10月更文挑战第8天
13 1
|
2月前
|
前端开发
React给antd中TreeSelect组件左侧加自定义图标icon
本文介绍了如何在React中为Ant Design的TreeSelect组件的每个树节点添加自定义图标,并解决了因缺少key属性而导致的警告问题,展示了如何通过递归函数处理treeData数据并为每个节点添加图标。
61 2
React给antd中TreeSelect组件左侧加自定义图标icon
|
2月前
|
前端开发
React添加路径别名alias、接受props默认值、并二次封装antd中Modal组件与使用
本文介绍了在React项目中如何添加路径别名alias以简化模块引入路径,设置组件props的默认值,以及如何二次封装Ant Design的Modal组件。文章还提供了具体的代码示例,包括配置Webpack的alias、设置defaultProps以及封装Modal组件的步骤和方法。
63 1
React添加路径别名alias、接受props默认值、并二次封装antd中Modal组件与使用
|
30天前
|
JavaScript 前端开发 安全
使用 TypeScript 加强 React 组件的类型安全
【10月更文挑战第1天】使用 TypeScript 加强 React 组件的类型安全
37 3