React Hooks:上天在提醒你,别再用Class组件了!

news2025/1/8 5:11:32

React Hooks:上天在提醒你,别再用Class组件了!

React Hooks 的出现可以说是前端界的一场革命。它不仅让我们告别了繁琐的 Class 组件,还让代码变得更加简洁、易读、易维护。如果你还在固守 Class 组件的阵地,那么这篇文章就是为你准备的!让我们一起来看看为什么 Hooks 是如此的香,以及如何优雅地使用它们。

为什么要用 Hooks?

首先,让我们来聊聊为什么要用 Hooks。想象一下,你正在写一个复杂的 Class 组件,里面充满了各种生命周期方法、状态管理逻辑和副作用。看起来是不是像一锅大杂烩?而 Hooks 则允许我们将相关的逻辑聚合在一起,使得代码更加模块化和可复用。

  1. 更简洁的代码:告别冗长的 Class 语法和繁琐的 this 绑定。
  2. 更好的逻辑复用:自定义 Hook 让我们能够在不同组件之间复用状态逻辑。
  3. 更易理解的组件:将相关的逻辑放在一起,而不是分散在不同的生命周期方法中。
  4. 避免 Class 的一些陷阱:比如 this 的绑定问题和闭包陷阱。

常用 Hooks 介绍

useState:状态管理的新宠

useState 是最基本也是最常用的 Hook。它让你在函数组件中添加状态,而不需要转换为 Class 组件。

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0);

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

看看这个简洁的计数器组件,是不是比 Class 组件优雅多了?

useEffect:副作用的好帮手

useEffect 让你在函数组件中执行副作用操作。它相当于 Class 组件中的 componentDidMountcomponentDidUpdatecomponentWillUnmount 的组合。

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>
  );
}

每次 count 更新时,useEffect 都会运行,更新文档标题。简单明了,不是吗?

useContext:上下文共享变得如此简单

useContext 让你不用嵌套就能订阅 React 的 Context。

import React, { useContext } from 'react';

const ThemeContext = React.createContext('light');

function ThemedButton() {
  const theme = useContext(ThemeContext);
  return <button style={{ background: theme }}>I'm styled by theme context!</button>;
}

再也不用写那些繁琐的 Consumer 组件了,一行代码搞定上下文!

自定义 Hook:复用逻辑的终极武器

自定义 Hook 是 React Hooks 的精髓所在。它让我们能够将组件逻辑提取到可重用的函数中。

import { useState, useEffect } from 'react';

function useWindowWidth() {
  const [width, setWidth] = useState(window.innerWidth);
  
  useEffect(() => {
    const handleResize = () => setWidth(window.innerWidth);
    window.addEventListener('resize', handleResize);
    return () => {
      window.removeEventListener('resize', handleResize);
    };
  }, []);

  return width;
}

function ResponsiveComponent() {
  const width = useWindowWidth();
  return <div>Window width is {width}</div>;
}

看,我们创建了一个 useWindowWidth Hook,它可以在任何组件中复用!这种逻辑复用的方式,比起高阶组件和 render props,不觉得优雅太多了吗?

Hooks 的注意事项

虽然 Hooks 很强大,但也有一些注意事项:

  1. 只在最顶层使用 Hooks:不要在循环、条件或嵌套函数中调用 Hook。
  2. 只在 React 函数中调用 Hooks:不要在普通的 JavaScript 函数中调用 Hook。
  3. 依赖数组要正确:在 useEffect 中要正确地声明依赖,否则可能会导致一些难以察觉的 bug。
useEffect(() => {
  // 这里使用了 count,所以要将 count 加入依赖数组
  document.title = `You clicked ${count} times`;
}, [count]); // 正确做法:将 count 加入依赖数组

从 Class 组件迁移到 Hooks

如果你有一个现有的 Class 组件想要迁移到 Hooks,以下是一些建议:

  1. 逐步迁移:不需要一次性重写所有组件。可以从简单的组件开始,逐步迁移到复杂的组件。
  2. 使用 useEffect 替代生命周期方法:大多数生命周期方法可以用 useEffect 来替代。
  3. 使用 useStateuseReducer 管理状态:根据状态的复杂程度选择合适的 Hook。
  4. 提取自定义 Hook:将可复用的逻辑提取到自定义 Hook 中。

结语

React Hooks 不仅仅是一个新特性,它代表了一种全新的组件开发思维。它让我们能够更加函数式、更加声明式地编写 React 组件。虽然 Class 组件仍然被支持,但 Hooks 提供了一种更加灵活、更加强大的方式来构建 UI。

所以,亲爱的开发者们,如果你还在坚持使用 Class 组件,不妨试试 Hooks。它可能会改变你写 React 的方式,让你的代码更加清晰、简洁、易于维护。毕竟,连 React 团队都在暗示你了:未来是 Hooks 的天下!

记住,拥抱变化才能进步。所以,放下你的 Class 偏见,拥抱 Hooks 吧!你会发现,原来 React 可以如此优雅。

海码面试 小程序

包含最新面试经验分享,面试真题解析,全栈2000+题目库,前后端面试技术手册详解;无论您是校招还是社招面试还是想提升编程能力,都能从容面对~

React 可以如此优雅。

海码面试 小程序

包含最新面试经验分享,面试真题解析,全栈2000+题目库,前后端面试技术手册详解;无论您是校招还是社招面试还是想提升编程能力,都能从容面对~

[外链图片转存中…(img-GMYElJzo-1720426442544)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1907326.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何处理 PostgreSQL 中由于表锁定导致的并发访问问题?

文章目录 一、表锁定的类型二、表锁定导致的并发访问问题三、解决方案&#xff08;一&#xff09;使用合适的锁定模式&#xff08;二&#xff09;优化事务处理&#xff08;三&#xff09;避免不必要的锁定&#xff08;四&#xff09;使用索引&#xff08;五&#xff09;监控和分…

Java-链表反转

题目&#xff1a; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 图示&#xff1a; 输入&#xff1a; head [1,2,3,4,5] 输出&#xff1a; [5,4,3,2,1] 解题思路&#xff1a; 情况一&#xff1a; 只有一个节点或者没有节点 …

小白学C++(第一天)基础入门

温馨提醒&#xff1a;本篇文章&#xff0c;请各位c基础不行的童鞋不要贸然观看 C的第一个程序 第一个关键字namespace namespace 是定义空间的名字的关键字&#xff0c;使用格式格式如下&#xff1a; namespace 空间名 { } 其中{ }内的命名空间的成员&#xff0c;可以定义…

计算机图形学入门26:高级光线传播

1.有偏与无偏 在做光线追踪很多方法都是用蒙特卡洛积分去估计&#xff0c;蒙特卡洛积分有些是无偏的(Unbiased)&#xff0c;所谓无偏估计就是无论使用多少个样品&#xff0c;所估计的期望值都是正确的。那么&#xff0c;所有其他情况都是有偏的(Biased)&#xff0c;就是估计的期…

MySQL存储与优化 一、MySQL架构原理

1.MySQL体系架构 MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层 (1)网络连接层 客户端连接器&#xff08;Client Connectors&#xff09;&#xff1a;提供与MySQL服务器建立的支持。目前几乎支持所有主流的服务端编程技术&#xff0c;例如常…

《初级C++》(一)

初级C&#xff08;一&#xff09; 1: C参考⽂档2&#xff1a;C创建与实现创建C的第一套程序命名空间的理解空间命名的实现C输⼊&输出缺省参数 1: C参考⽂档 https://legacy.cplusplus.com/reference/ 《非官方》 https://zh.cppreference.com/w/cpp 《官方中文版》 https:/…

前端面试题28(Vue3的Teleport功能在什么场景下特别有用?能给个例子吗?)

Vue 3 的 Teleport 功能在需要将组件的渲染结果放置在 DOM 树中与当前组件位置无关的任意位置时特别有用。这通常涉及到需要将某些UI元素&#xff08;如模态框、弹出菜单、通知、工具提示等&#xff09;从其逻辑上的父级组件中“提取”出来&#xff0c;放置到页面的更高层级或完…

PCIe 入门 Demo(一):基础知识

PCIe 入门 Demo&#xff08;一&#xff09;&#xff1a;基础知识 主要参考 up主 芯片人阿伟 的教程【针对 RISC-V 架构】 视频介绍&#xff1a;https://www.bilibili.com/video/BV1Xm4y1V757 源码仓库&#xff1a;https://github.com/oldawei/show_me_the_code 本文主要补充一些…

前端JS特效第24集:jquery css3实现瀑布流照片墙特效

jquery css3实现瀑布流照片墙特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8" /> <title>jquerycss3实现瀑…

java中==和equals()的区别探究

目录 一、Object对象 二、 三、String类的equals()方法 四、示例 4.1直接定义两个相同的值比较 4.2直接定义两个值不同的字符串进行比较 4.3直接定义一个字符串和new一个字符串进行比较&#xff08;两者值相同&#xff09; 4.4直接定义一个字符串和new一个字符串进行…

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码

文华财经盘立方期货通鳄鱼指标公式均线交易策略源码&#xff1a; 新建主图幅图类型指标都可以&#xff01; VAR1:(HL)/2; 唇:REF(SMA(VAR1,5,1),3),COLORGREEN; 齿:REF(SMA(VAR1,8,1),5),COLORRED; 颚:REF(SMA(VAR1,13,1),8),COLORBLUE;

Vue3 项目中 svg 图标的封装及使用

安装 npm install vite-plugin-svg-icons -D在 vite.config.ts 中配置插件&#xff1a; import { createSvgIconsPlugin} from vite-plugin-svg-icons; import path from path;plugins: [createSvgIconsPlugin({iconDirs: [path.resolve(process.cwd(), src/assets/icons)],s…

解决win10报“无法加载文件……profile.ps1,因为在此系统上禁止运行脚本”的问题

打开命令行报错 解决方法 使用管理员权限打开PowerShell&#xff1a;WinX, 选择“Windows PowerShell&#xff08;管理员&#xff09;” 输入&#xff1a;Set-ExecutionPolicy -ExecutionPolicy RemoteSigned 输入&#xff1a;y确认修改安全策略 &#xff1a;y确认修改安全策略…

CAD、CAE、CAM介绍——定义,概述,历史,相关软件,应用与前景

目录 引出CAD/CAE/CAM计算机辅助设计 Computer-aided design (CAD)1.定义&#xff1a;2.概述3.类别4.科技5.软件&#xff1a; 计算机辅助工程 Computer-Aided Engineer (CAE)1.定义&#xff1a;2.概述3.CAE领域&#xff1a;4.应用与前景 计算机辅助制造 Computer-aided manufac…

Python自动化测试系列[v1.0.0][高效自动化设计]

Python多线程应用于自动化测试 将多线程在测试巧妙地应用&#xff0c;确实会带来很多好处&#xff0c;并且这是充分利用机器资源执行高效率测试很好的方式 # -*- coding: utf-8 -*- import threading from time import ctime import time from selenium import webdriverdef …

百度网盘非会员,享受视频倍速

百度网盘会员过期了&#xff0c;看视频不能倍速很难受&#xff0c;下面就是跨过会员机制&#xff0c;享受倍速的方法。 Edge浏览器 在浏览器设置中找到扩展选项 在扩展中搜索视频速度控制 global speed&#xff0c;安装后即可使用

品牌推广必备:软文案例撰写与文案策划全解析!

做品牌推广&#xff0c; 不仅需要有推广渠道&#xff0c;文案的策划也是必不可少的一部分。文案是属于灵魂的部分。 作为一名手工酸奶品牌的创始人&#xff0c;目前全国也复制了100多家门店&#xff0c;这篇文章&#xff0c;详细和大家拆解&#xff0c;文案创作的要点&#xf…

金融科技赋能:加马智能质检系统引领金融机构迈向高效合规新时代

为了保护消费者合法权益、促进市场稳定健康发展&#xff0c;近年来监管机构相继发布了《银行保险机构消费者权益保护管理办法》、《银行业金融机构销售专区录音录像管理暂行规定》、《保险销售行为管理办法》等多项法律法规&#xff0c;对于银行、保险等金融机构的服务、销售行…

神卓互联共享文件使用教程

#文件共享# 文件共享已成为我们日常生活和工作中不可或缺的一部分。它如同一条无形的纽带&#xff0c;将人们紧密地联系在一起&#xff0c;促进了信息的快速传播和交流。 文件共享的魅力在于其打破了地域和时间的限制。无论我们身处世界的哪个角落&#xff0c;只要有网络连接&a…

我们所熟知的meme梗图也可以用AI生成了,老外都玩坏了。

meme梗图不知道大家看到过嘛&#xff1f;相信你们看见下面的图你就会大叫“卧槽”&#xff0c;原来是这种图&#xff0c;我以前经常狂刷不止&#xff0c;太有趣了。 其实meme是一个网络流行语&#xff0c;可译为模因。在大众非学术范围内也可翻译为我们所熟知的“梗”。其中“表…