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

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)]

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3项目实战中的接口调用

vue项目组成 一个项目往往由这几个部分组成。&#x1f447;&#x1f447; 其中在src文件夹中的内容如下&#x1f447;&#x1f447; 我们常常将接口文件&#xff0c;新建在文件夹src下&#xff0c;一般命名为api&#xff0c;api内的文件便是接口文件。&#x1f447;&#x1f4…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

OpenCV基础(2)

目录 滤波处理 均值滤波 基本原理 函数用法 程序示例 高斯滤波 基本原理 函数用法 程序示例 中值滤波 基本原理 函数用法 程序示例 形态学 腐蚀 膨胀 通用形态学函数 前言&#xff1a;本部分是上一篇文章的延续&#xff0c;前面部分请查看&#xff1a;OpenCV…

MyBatis的底层机制

手写MyBatis底层机制 读取配置文件&#xff0c;得到数据库连接 思路 引入必要的依赖需要写一个自己的config.xml文件&#xff0c;在里面配置一些信息&#xff0c;driver&#xff0c;url &#xff0c;password&#xff0c;username需要编写Configuration类&#xff0c;对 自己…

服务器数据恢复—同品牌不同系列服务器raid5阵列数据恢复方案分析

RAID5磁盘阵列数据恢复案例一&#xff1a; 服务器数据恢复环境&#xff1a; 一台某品牌LH6000系列服务器&#xff0c;通过NetRaid阵列卡将4块硬盘组建为一组RAID5磁盘阵列。操作系统都为Window server&#xff0c;数据库是SQLServer。 服务器故障&#xff1a; LH6000系列服务器…

四、嵌入式技术(考点篇)试题(1)

我选择C&#xff0c;实际答案选B&#xff0c;答案给出的理由是&#xff0c;SoC是片上系统&#xff0c;包含完整系统和嵌入式软件全部内容&#xff0c;B的说法有点片面。 明显选C&#xff0c;嵌入式跟通用性不太沾边。 嵌入式OS特征&#xff1a;裁剪配置安全可靠实时高确定&…

Python基础知识——(001)

文章目录 P4——3. 程序设计语言的分类 1. 程序设计语言 2. 编译与解释 P5——4. Python语言的简介与开发工具 1. Python语言的简介 2. Python语言的发展 3. Python语言的特点 4. Python的应用领域 5. Python的开发工具 P6——5. IPO编程方式 IPO程序编写方法 P7——6. print函…

大模型隐私窃取攻击

前言 对于大模型风险&#xff0c;目前大家更多关注的还是越狱攻击。隐私这一块&#xff0c;可能国内还不如欧美重视&#xff0c;在安全的学术四大会议论文中&#xff0c;有时候甚至AI隐私的论文比AI安全的论文更多。但实际上&#xff0c;除了越狱之外&#xff0c;另外一大风险…

监控电脑软件【2024最新】|6款软件保姆式解析!

在数字化办公日益普及的今天&#xff0c;很多企业为了更好的提升员工的工作效率和保障企业的数据安全&#xff0c;开始给自己的企业布局电脑监控软件。 但市面上的电脑监控软件种类繁多复杂&#xff0c;为了更好的保障企业利用&#xff0c;小编推荐了以下几款电脑监控软件供大…

阶段三:项目开发---大数据开发运行环境搭建:任务4:安装配置Spark集群

任务描述 知识点&#xff1a;安装配置Spark 重 点&#xff1a; 安装配置Spark 难 点&#xff1a;无 内 容&#xff1a; Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark是UC Berkeley AMP lab (加州大学伯克利分校的AMP实验室)所开源的类Hadoop …

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

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

【c语言】玩转文件操作

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;C语言 目录 引言 一、文件的打开和关闭 1.流 2.标准流 3.文本文件和二进制文件 4.控制文件打开与关闭的函数 二、文件的顺序读写 三、文件的随机读写 1…

7月学术会议:7月可投的EI国际会议

随着科技的迅猛发展&#xff0c;学术交流与研讨成为了推动科研进步的重要途径。进入7月&#xff0c;众多高质量的EI国际会议纷纷拉开帷幕&#xff0c;为全球的科研工作者提供了一个展示研究成果、交流学术思想的平台。以下&#xff0c;我们将详细介绍一些在7月可投的EI国际会议…

Java集合升序降序、转Set的方法

Collections.sort(list,Comparator.comparing(OcApplySquareVo::getApplyName).reversed()); 集合转set /** 集合转set */Set<String> pkCodeSet rows.stream().map(RailwayWeighBookResult.RailwayWeighBook::getPkCode).collect(Collectors.toSet());

猫咪浮毛太多怎么处理?6年铲屎官最值得买的猫毛空气净化器分享

作为一位拥有6年铲屎经验的铲屎官&#xff0c;家中既有宝宝又有毛孩子的铲屎官家庭来说&#xff0c;空气中的宠物异味和猫毛不仅影响生活质量&#xff0c;更关乎家人的健康。普通空气净化器虽然能够提供基本的空气净化&#xff0c;但对于养猫家庭的特定需求&#xff0c;如去除宠…

Pytest单元测试系列[v1.0.0][Pytest基础]

Pytest安装与配置 和Unittest一样&#xff0c;Pytest是另一个Python语言的单元测试框架&#xff0c;与Unittest相比它的测试用例更加容易编写、运行方式更加灵活、报错信息更加清晰、断言写法更简洁并且它可以运行有unittest和nose编写的测试用例。 Pytest 安装 启动命令行&…

A股本周在3000点以下继续筑底,本周依然继续探底?

夜已深&#xff0c;市场传来了3个浓烈的消息&#xff0c;炸锅了&#xff0c;恐有大事发生&#xff0c;马上告诉所有人&#xff1a; 消息面&#xff1a; 1、中国经济周刊首席评论员钮文新称&#xff1a;不要等中小投资者都彻底希望&#xff0c;销户离场了&#xff0c;才发现该…

新恒汇过会一年多注册仍遥遥无期,实控人大额负债入股资金靠借款

《港湾商业观察》施子夫 自2022年6月递表深交所创业板获受理&#xff0c;新恒汇电子股份有限公司 &#xff08;以下简称&#xff0c;新恒汇&#xff09;的上市之路无疑颇显诸多坎坷。2022年7月&#xff0c;深交所下发第一轮审核问询函&#xff1b;同年11月&#xff0c;深交所下…

Bugly的底层是怎么实现的

Bugly 入门 首先&#xff0c;简要介绍什么是 Bugly 以及它的主要功能&#xff1a; Bugly 是什么&#xff1a; Bugly 是腾讯提供的一款移动应用质量监控工具&#xff0c;主要用于捕捉应用的崩溃、ANR&#xff08;应用无响应&#xff09;、卡顿和错误日志。 主要功能&#xff1…

微型导轨如何提升数控机床的稳定性?

数控机床是加工设备中常用的机床&#xff0c;精度和稳定性是衡量数控机床性能的重要指标。而微型导轨作为数控机床中重要的传动元件&#xff0c;数控机床与其具体结构性能是密不可分的&#xff0c;那么微型导轨如何提高数控机床的稳定性呢&#xff1f; 1、微型导轨通过采用先进…