一文带你了解React Hooks

news2024/9/19 9:45:20

目录

一、useState

二、useRef

三、useEffect

四、自定义Hook

五、Hooks使用规则


Hooks原意是“挂钩”,指将类组件中的部分功能直接可以挂钩函数组件中,例如state、生命周期方法、副作用等功能。

为什么使用Hooks?

  1. 封装代码,提高复用性
  2. 更强的可读性

一、useState

概念

  • useState是React的一个Hook函数,它运行我们向组件添加一个状态变量,从而控制影响组件的渲染结果
  • 制作响应式数据

示例:useState 实现一个自增计数器

import {useState} from "react";

function App() {
    // 1. 调用useState添加一个状态变量
    // count:状态变量
    // setCount:修改状态变量的方法
    const [count, setCount] = useState(0);

    // 2. 点击事件回调
    const handleClick = () => {
        /**
         * 作用
         * 1. 用传入的新值修改count
         * 2. 重新使用新的count渲染UI
         */
        setCount(count + 1);
    }
    return (
        <div className="App">
            <button onClick={handleClick}>{count}</button>
        </div>
    );
}

export default App;

规则

  1. 状态不可变:状态被认为是只读的,我们应该始终替换它而不是修改它,直接修改不能引发视图更新
  • 个人理解:要修改状态变量,只能使用它提供的setXxx()方法,如果直接修改,该状态是不会联动视图一起修改的

  1. 修改状态对象:对于对象类型的状态变量,应该始终传给set方法一个全新的对象来进行修改
  • 个人理解:如果状态变量是对象,那么传给set方法的应该是一个全新的对象,而不是在原本的对象的基础上修改,然后再传给set方法


二、useRef

作用

  • 获取 / 操作DOM

步骤

  1. 使用useRef创建ref对象,并与JSX绑定
  2. 在DOM可用时,通过ref对象.current拿到DOM对象
  • 渲染完毕之后(dom生成之后)才可用
import {useRef} from "react";

function App() {
    // 1. 使用useRef创建ref对象,并与JSX绑定
    const inputRef = useRef(null)

    // 2. 在DOM可用时,通过ref对象.current拿到DOM对象
    const showDOM = () => {
        console.dir(inputRef.current)
    }
    return (
        <div>
            <input type="text" ref={inputRef}/>
            <button onClick={() => showDOM()}>showDOM</button>
        </div>
    );
}

export default App;

三、useEffect

作用

  • 用于在React组件中触发不是由事件引起而是由渲染本身引起的操作,比如发生AJAX请求、更改DOM等等
  • 个人理解:类似Vue组件的生命周期,我们可以在不同生命周期内做不同的事情

基础使用

useEffect(() => {}, [])

参数详解

  • 参数1:副作用函数,函数内部放置需要执行的操作
  • 参数2(可选):在数组里放置依赖性,不同的依赖项会影响副作用函数的执行
    • 空数组:副作用函数只会在组件渲染完毕后执行一次
import {useEffect, useState} from "react";


const URL = "http://geek.itheima.net/v1_0/channels"

function App() {

    // 频道列表
    const [list, setList] = useState([])
    useEffect(() => {
        async function getList() {
            const res = await fetch(URL)
            const channels = await res.json()
            setList(channels.data.channels)
        }
        getList()
    }, [])

    return (
        <div>
            this is app
            <ul>
                {list.map(item => (
                        <li key={item.id}>{item.name}</li>
                    )
                )}
            </ul>
        </div>
    );
}

export default App;

依赖项参数说明(执行时机

依赖项

副作用函数执行时机

  1. 组件初始渲染
  2. 组件更新时执行

空数组

只在初始渲染时执行一次

特定依赖项

  1. 组件初始渲染
  2. 特定依赖项变化时执行
import {useEffect, useState} from "react";

function App() {
    const [count, setCount] = useState(0)
    // 1. 没有依赖项:初始 + 组件更新
    // useEffect(() => {
    //     console.log("副作用函数执行了")
    // })

    // 2. 空数组:初始执行一次
    // useEffect(() => {
    //     console.log("副作用函数执行了")
    // }, [])

    // 3. 特定依赖项:初始 + 特定依赖性更新
    useEffect(() => {
        console.log("副作用函数执行了")
    }, [count])

    return (
        <div>
            this is app
            <button onClick={() => setCount(count + 1)}>{count}</button>
        </div>
    );
}

export default App;

清除副作用

副作用操作

  • 在useEffect中编写的由渲染本身引起的对接组件外部的操作
  • 比如:useEffect中开启了一个定时器,我们想在组件卸载时把这个定时器清理掉,这个过程就是清理副作用
useEffect(() => {
  // 实现副作用操作逻辑
  return () => {
    // 清除副作用逻辑
  }
}, [])

说明:清除副作用的函数最常见的执行时机是在组件卸载时自动执行

四、自定义Hook

概念

  • 自定义Hook是以use打头的函数,通过自定义Hook函数可以用来实现逻辑的封装和复用

示例:控制元素显示

import {useState} from "react";

// 封装自定义Hook
function useToggle() {
    const [value, setValue] = useState(true);
    const toggle = () => setValue(!value);

    return {
        value, toggle
    }
}

function App() {
    const {value, toggle} = useToggle();

    return (
        <div>
            {value && <div>this is app</div>}
            <button onClick={toggle}>toggle</button>
        </div>
    );
}

export default App;

五、Hooks使用规则

规则

1)只能在组件中或者其他自定义Hook函数中调用

2)只能在组件的顶层调用,不能嵌套在if、for、其他函数中

即函数的定义不能出现在上述情况中,但函数所产生的属性或方法可以

错误示例

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

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

相关文章

Harmony鸿蒙应用开发:解决Web组件加载本地资源跨域

鸿蒙开发文档中有一节 加载本地页面 提到了可以通过 $rawfile 方法加载本地 HTML 网页&#xff1a; Index.ets 1Web({ src: $rawfile("local.html"), controller: this.webviewController })但是如果在 local.html 中需要引用一些静态资源&#xff0c;例如图片、JS、…

STM32——TIM定时器的输入捕获功能

一、什么是输出比较与输入捕获&#xff1f; 可以看到&#xff1a; 输出比较OC是用于输出一定频率和占空比的PWM波形&#xff0c;可用于电机驱动进行调速等&#xff1b;而输入捕获IC是用于测量PWM波形的频率以及占空比等参数&#xff1b;和他们的名字相反&#xff0c;一个是比…

Datawhale AI夏令营第四期魔搭- AIGC文生图方向 task01笔记

目录 分任务1&#xff1a;跑通baseline 第一步——搭建代码环境 第二步——报名赛事 第三步——在魔搭社区创建PAI实例 分任务2&#xff1a;相关知识学习以及赛题理解 赛题理解&#xff1a; 文生图基本认识&#xff1a; 1. Diffusion Model(扩散模型) 2. LDMs&#x…

嵌入式Linux学习笔记

1.文件操作命令 2.VI编辑器的部分命令 3.Uboot命令设置环境变量 4. uboot 的顶层 Makefile的重点是“make xxx_defconfig”和“make”这两个命令 &#xff0c;分别如下&#xff1a; 5.在串口SecureCRT中利用uboot启动Linux内核的两种方式 6.Linux内核移植到开发板上也可以反…

常见错误导引 不锈钢螺钉的正确选购和使用分析

紧固件或螺钉是用于固定物体的机械工具。它们用于各种场景&#xff0c;从建造房屋、用具、玩具等。紧固件由多种材料制成&#xff0c;所有这些材料都有特定用途紧固件和用途。一些用于制造螺丝的材料包括不锈钢、铁、铜、铝和塑料。它通常会进行某种表面处理以提高其防锈性和/或…

day-40 合并区间

思路 将二维数组按照第一列升序排列&#xff0c;把intervals[0][0]作为第一个区间的起点&#xff0c;将 intervals[0][1]和intervals[1][0]进行比较&#xff0c;如果intervals[0][1]<intervals[1][0]&#xff0c;则不能合并&#xff0c;否则可以合并&#xff0c;将Math.max(…

绝对不能错过的60个Python日常高频写法总结!

一、 数字 1 求绝对值 绝对值或复数的模 In [1]: abs(-6)Out[1]: 62 进制转化 十进制转换为二进制&#xff1a; In [2]: bin(10)Out[2]: 0b1010十进制转换为八进制&#xff1a; In [3]: oct(9)Out[3]: 0o11十进制转换为十六进制&#xff1a; In [4]: hex(15)Out[4]: 0xf…

[ICS] 物理安全

工业控制系统安全气泡类比 这个理念是&#xff0c;为了防御那些无法更新到最新安全控制措施的旧系统&#xff0c;或者由于设备资源有限而无法处理安全控制措施的系统&#xff0c;帮助可视化这种设备的安全策略可以将它们放置在一个肥皂泡或玻璃泡中。泡中的系统和设备彼此信任…

Spring Cloud Stream与Kafka(一)

Spring Cloud Stream与Kafka&#xff08;一&#xff09; ​ 在实际开发过程中&#xff0c;消息中间件用于解决应用解耦&#xff0c;异步消息&#xff0c;流量削峰等问题&#xff0c;实现高可用、高性能、可伸缩和最终一致性架构。不同的消息中间件实现方式不同&#xff0c;内部…

遥感反演保姆级教程:SPSS筛选因子之后如何采用python建模和反演整个研究区?(以反演生物量为例)

SPSS筛选因子之后如何采用python建模和反演整个研究区?&#xff08;以反演生物量为例&#xff09; 引言 在遥感数据分析中&#xff0c;因子筛选和建模是关键步骤。筛选出与目标变量&#xff08;如生物量&#xff09;显著相关的因子&#xff0c;不仅可以提高模型的预测精度&a…

编程世界的平衡术:日常编码与自我提升的和谐共生

前言 在快速迭代的编程世界中&#xff0c;程序员的角色日益复杂且充满挑战&#xff0c;他们不仅是代码的编织者&#xff0c;更是技术进步的推动者。面对日常编码工作的繁重与个人成长的迫切需求&#xff0c;寻找两者之间的平衡点成为了每位程序员必须深思的问题。以下是我的详细…

C++初学者指南-5.标准库(第二部分)–特殊容器

C初学者指南-5.标准库(第二部分)–特殊容器 pair<A , B> 包含两个相同或不同类型的值 tuple<A , B> C11 包含许多相同或不同类型的值 optional C17 包含一个类型为 T 的值或没有值 variant<A,B,C,…> C17 包含一个类型为A、B或C的值…… any C17 包含任…

《花100块做个摸鱼小网站! 》第四篇—前端应用搭建和完成第一个热搜组件

⭐️基础链接导航⭐️ 服务器 → ☁️ 阿里云活动地址 看样例 → &#x1f41f; 摸鱼小网站地址 学代码 → &#x1f4bb; 源码库地址 一、前言 在本系列文章的早期章节中&#xff0c;我们已经成功地购买了服务器并配置了MySQL、Redis等核心中间件。紧接着&#xff0c;我们不仅…

用AI来学习英语口语(白嫖,所以稍微麻烦些)

写在前面 本文看下如何使用AI来免费学习英语口语。 1&#xff1a;正文 首先&#xff0c;我们点击这里来到一个对话窗口&#xff0c;你可以在这个窗口中使用英语来询问你的问题&#xff0c;比如what can i do when i am not happy&#xff1a; 接着复制机器人回答内容&#…

datawhale AI夏令营第五期 深度学习入门 Task1 了解机器学习

机器学习基础 定义 学习一般是只有人才具备的能力&#xff0c;机器学习就是通过某种方式让机器具备人才有的学习能力&#xff0c;这里的某种方式是机器具备找一个函数的能力 比如说证件照背景颜色更换&#xff0c;那么机器需要找到图片中的背景在哪里&#xff0c;再替换成目…

pandas操作Excel文件

pandas操作Excel文件 一、前言二、指定读取的工作表与header设置2.1指定工作表2.2header设置 三、读取Excel数据3.1iloc读取数据3.2read_excel读取数据3.3loc读取数据 四、DataFrame数据筛选4.1根据列标签对整列进行筛选4.2使用iloc对区域进行筛选4.3自定义筛选 五、DataFrame类…

2024年8月26日(线上考试系统,虚拟化技术部署,使用link)

[rootdocker ~]# systemctl start docker [rootdocker ~]# docker pull mysql 一、线上考试系统 虚拟化技术部署 1、部署前端服务器 project_exam_system.sql数据库文件 dist网络资源 1.将资源上传到服务器 C:\Users\89765>scp -r "D:\青岛实训\project_exam_system\d…

C语言典型例题52

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 题目&#xff1a; 例题4.4 相传古代印度国王舍罕要褒奖他聪明能干的宰相达依尔&#xff08;国际象棋发明者&#xff09;&#xff0c;问他需要什么&#xff0c;达依尔回答说&#xff1a;“国王只要在国际象棋的棋盘的…

Shader 中的渲染顺序

1、深度测试和深度写入 有了深度测试和深度写入发挥作用让我们不需要关心不透明物体的渲染顺序比如一个物体A 挡住了 物体B&#xff0c;即使底层逻辑中 先渲染A&#xff0c;后渲染B&#xff0c;我们也不用担心 B的颜色会把A覆盖&#xff0c;因为在进行深度测试时&#xff0c;远…

电池管理系统SOX算法资料优化目录2024.8.26

这篇文章主要写一下这一次更新的几个地方&#xff0c;有对原来的代码及模型进行优化的部分&#xff0c;也有新增加的代码和模型&#xff0c;我就把几个比较典型的给列了出来。但是还有好多的更新没有在下面展示出来&#xff0c;因为一个个展示出来太复杂了。如果你对更新的内容…