React中常用的钩子

在当今,React的钩子写法已经逐渐成为了一种主流开发模式,本文将介绍几种在React中常用的钩子

  1. useState
    可以用来双向绑定,创建需要监听变化并且使用的数据
    使用该钩子定义时,参数可以是一个直接定义好的变量,也可以是一个函数,函数返回什么,初始状态就是什么,函数只会被调用一次,用在初始值是动态值的情况下(props)
import React, { useState } from 'react';function Counter() {const [count, setCount] = useState(0);return (<div><h2>Count: {count}</h2><button onClick={() => setCount(count + 1)}>Increment</button></div>);
}export default Counter;
  1. useRef
    用于获取操作DOM
    可以存储上一次渲染的值,用useRef创建一个对象来存储setState前的旧值
import { useRef } from "react";/*** 1、useRef生成ref对象 绑定到dom标签上* 2、DOM可用时,ref.current获取DOM,渲染完毕之后DOM生成之后才可用*/
function App() {const inputRef = useRef(null);const showDom = () => {console.log(inputRef.current);};return (<div className="App"><input type="text" ref={inputRef} /><button onClick={showDom}>获取DOM</button></div>);
}

也可以用于保存数据,特点是跨组件周期,组件重新渲染的时候还会存在,确保不会丢失

import React, { useRef, useEffect, useState } from 'react'export default function ref() {const [count, setCount] = useState(0)const timerId = useRef()useEffect(() => {timerId.current = setInterval(() => {setCount(count => count + 1)}, 1000)}, [])const stopCount = () => {console.log(timerId);clearInterval(timerId.current)}return (<div>{count}<button onClick={stopCount}>停止</button></div>)
}
  • useEffect
    这个钩子在我们开发的时候特比较常用,所对应的情况也比较多一点,可以看作类组件挂载完成之后、组件数据更新完成之后、组件卸载之前去执行,主要分为以下几种情况
    在这里插入图片描述
  • 没有依赖项
function App() {const [count, setCount] = useState(0);useEffect(() => {console.log(111);});return (<div><button onClick={() => setCount(count + 1)}>+{count}</button></div>);
}
  • 空数组依赖
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 list = await res.json();console.log(list);setList(list.data.channels);}getList();}, []);return (<div>this is app{list.map((i) => (<li key={i.id}>{i.name}</li>))}</div>);
}
  • 添加特定的依赖项
function App() {const [count, setCount] = useState(0);useEffect(() => {console.log(111);},[count]);return (<div><button onClick={() => setCount(count + 1)}>+{count}</button></div>);
}

最后,我们在使用完成后,还应该清除对应的副作用,最常见的时机是在组件卸载时自动执行

function Son() {useEffect(() => {const timer = setInterval(() => {console.log("定时器执行中...");}, 1000);return () => {clearInterval(timer);};}, []);return <div>this is son</div>;
}function App() {const [show, setShow] = useState(true);return (<div>{show && <Son></Son>}<button onClick={() => setShow(false)}>卸载Son组件</button></div>);
}
  1. useMemo
    该钩子属于React性能优化中的一环,可以对数据进行缓存
    类似于Vue中的计算属性,可以监听某个值的变化,根据变化值重新计算新值
    会缓存计算结果,如果检测到值没有变化,即时组件重新渲染,也不会重新计算,可以有助于避免在每个渲染上浪费计算
import React, { useMemo } from 'react';function ExpensiveCalculation({ num }) {const calculateFactorial = (n) => {console.log('Calculating factorial...');return n <= 1 ? 1 : n * calculateFactorial(n - 1);};const factorial = useMemo(() => calculateFactorial(num), [num]);return (<div><h2>Factorial of {num}: {factorial}</h2></div>);
}
  1. useCallback
    用来缓存函数,使组件渲染的时候得到相同的函数实例,避免函数在组件重新渲染时重新创建
import React, { useState, useCallback } from 'react';function Child({ onClick }) {console.log('Child component rendered');return <button onClick={onClick}>Click Me</button>;
}function Parent() {const [count, setCount] = useState(0);// 使用 useCallback 避免函数在每次渲染时重新创建const handleClick = useCallback(() => {alert('Button clicked!');}, []);return (<div><h2>Count: {count}</h2><button onClick={() => setCount(count + 1)}>Increment</button><Child onClick={handleClick} /></div>);
}
  1. useReducer
    让函数组件保存状态的方式,与usestate钩子相比,结合了usestate和redux的优点,比如说在父组件想要修改子组件数据的时候,就不需要传递方法了,可以直接吧dispatch传递过去进行修改使用(通过props进行传递即可)
import { useReducer } from 'react'function App() {const reducer = (state, action) => {switch (action.type) {case 'plus':return state + 1;case 'des':return state - 1;default:return state;}}const [count, dispatch] = useReducer(reducer, 0)return (<><div className="card"><button onClick={() => dispatch({ type: "plus" })}>+1</button>{count}<button onClick={() => dispatch({ type: "des" })}>-1</button></div></>)
}
  1. useContext
    在跨组件层级获取数据时简化数据的代码(App -> Foo)
import React, { useContext, useState } from 'react';// 1. 创建 Context
const UserContext = React.createContext();function App() {const [user, setUser] = useState({ name: 'Alice', age: 25 });return (// 2. 使用 Provider 共享数据<UserContext.Provider value={user}><UserProfile /></UserContext.Provider>);
}function UserProfile() {// 3. 在子组件中使用 useContext 获取 Context 的值const user = useContext(UserContext);return (<div><h2>User Profile</h2><p>Name: {user.name}</p><p>Age: {user.age}</p></div>);
}export default App;

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

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

相关文章

.NET SDK 各操作系统开发环境搭建

一、Win10&#xff08;推荐&#xff09; 1、VS 2022 社区版 # 下载地址 https://visualstudio.microsoft.com/zh-hans/downloads/ 2、.NET 6 SDK # 下载地址 https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0 3、Hello World 如果需要使用旧程序样式时&#xff0c;则…

Linux 下网络套接字(Socket) 与udp和tcp 相关接口

文章目录 1. socket常见API2 sockaddr结构体及其子类1. sockaddr结构体定义&#xff08;基类&#xff09;2. 子类 sockaddr_in结构体用于(IPv4)3 子类 sockaddr_un(Unix域套接字)4. 总结画出其结构体 3.实现一个简单的tcp Echo 服务器和客户端(cpp&#xff09;3.1 客户端3.2 服…

跨平台WPF框架Avalonia教程 七

数据绑定 Avalonia使用数据绑定将数据从应用程序对象传递到UI控件&#xff0c;根据用户输入更改应用程序对象中的数据&#xff0c;并在响应用户命令时对应用程序对象进行操作。 在这种安排中&#xff0c;控件是绑定目标&#xff0c;而对象是数据源。 Avalonia运行数据绑定系统…

日常ctf

1&#xff0c; [陇剑杯 2021]日志分析&#xff08;问1&#xff09; %2e 为URL编码的符号 "." flag{www.zip} 2&#xff0c; [陇剑杯 2021]日志分析&#xff08;问2&#xff09; 根据之前题目的分析&#xff0c;在获取到源码文件之后&#xff0c;黑客又成功访问了in…

基于微信小程序的校园助手+LW示例参考

1.项目介绍 项目角色&#xff1a;管理员、普通用户功能模块&#xff1a;管理员&#xff08;用户管理、寻物启事管理、物品分类管理、表白广场、吐槽大会、二手交易、拼车出行等&#xff09;、普通用户&#xff08;登录注册、寻物启事、失物招领、表白广场、吐槽大会、拼车出行…

逆向攻防世界CTF系列38-xxxorrr

逆向攻防世界CTF系列38-xxxorrr 64位无壳&#xff0c;很自然的找到main和一个比较函数 以为逻辑很简单了 enc [0x56, 0x4E, 0x57, 0x58, 0x51, 0x51, 0x09, 0x46, 0x17, 0x46,0x54, 0x5A, 0x59, 0x59, 0x1F, 0x48, 0x32, 0x5B, 0x6B, 0x7C,0x75, 0x6E, 0x7E, 0x6E, 0x2F, 0…

数据结构-堆排序笔记

1 思路 总体思路 首先我们会拿到一个无序的数组&#xff0c;我们需要先对其构建成一个堆。下面我们示例将会构建成大顶堆。然后我们对顶堆的元素进行位置之间的交换。交换的同时继续对其维护大顶堆的性质&#xff0c;直至大顶堆只剩下一个元素。 具体思路 首先我们先将一个…

如何在react中使用react-monaco-editor渲染出一个编辑器

一、效果展示 二、基于vite配置 1.首先安装react-monaco-editor和monaco-editor包 npm add react-monaco-editor npm i monaco-editor 2.其次创建一个单独的文件&#xff08;此处是tsx、直接用app或者jsx也行&#xff09; import { useState, useEffect } from react impo…

跨平台WPF框架Avalonia教程 六

添加交互性 用户界面的一个基本功能是与用户进行交互。在Avalonia中&#xff0c;您可以通过使用事件和命令来为应用程序添加交互性。本指南将通过简单的示例介绍事件和命令。 处理事件​ Avalonia中的事件提供了一种响应用户交互和控件特定操作的方式。您可以按照以下步骤处…

【传知代码】VRT_ 关于视频修复的模型

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ VRT_ 关于视频修复的模型 背景介绍&#xff1a;重要性&#xff1a; VRT的重要性和研究背景VRT的背景&#xff1a;VRT的重要性&#xff1a; 视…

药界互联:中药实验管理的网络化

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了中药实验管理系统的开发全过程。通过分析中药实验管理系统管理的不足&#xff0c;创建了一个计算机管理中药实验管理系统的方案。文章介绍了中药实验管理系统的系…

【Linux】进程字段、环境变量与进程地址空间

&#x1f308; 个人主页&#xff1a;谁在夜里看海. &#x1f525; 个人专栏&#xff1a;《C系列》《Linux系列》《算法系列》 ⛰️ 丢掉幻想&#xff0c;准备斗争 目录 一、查看进程字段 1.字段说明 2.进程优先级 二、环境变量 1.概念 2.指令与PATH 3.环境变…

基于isSpring的PPT转换

背景 PPT课件目前还是一项在教学中高度频繁使用的工具&#xff0c;对于在线教学就更为重要了。如何把PPT转换为在线web&#xff0c;同时保留更多的PPT特性&#xff08;动画、音效、视频&#xff09;呢&#xff1f;这里介绍一种基于iSpring的PPT转换工具。用以解决在线PPT的这一…

【论文笔记】LoRA: Low-Rank Adaptation of Large Language Models

&#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&#xff0c;为生民立命&#xff0c;为往圣继绝学&#xff0c;为万世开太平。 基本信息 标题: LoRA: Low-Rank Adaptatio…

RHCE的学习(21)

第三章 Shell条件测试 用途 为了能够正确处理Shell程序运行过程中遇到的各种情况&#xff0c;Linux Shell提供了一组测试运算符。 通过这些运算符&#xff0c;Shell程序能够判断某种或者几个条件是否成立。 条件测试在各种流程控制语句&#xff0c;例如判断语句和循环语句中…

智能购物时代:AI在电商平台的革命性应用

在当今数字化时代&#xff0c;人工智能&#xff08;AI&#xff09;技术已成为推动电商行业发展的关键力量。AI技术的应用不仅改变了电商的运营模式&#xff0c;还极大地丰富了消费者的购物体验。随着技术的不断进步&#xff0c;AI在电商领域的应用越来越广泛&#xff0c;从个性…

【Linux】环境变量

目录 一、什么是环境变量: 1、系统命令搜索路径&#xff08;PATH&#xff09;&#xff1a; 2、HOME&#xff1a; 3、SHELL&#xff1a; 4、添加环境变量&#xff1a; 二、通过代码获取环境变量&#xff1a; 三、主函数参数&#xff1a; argc表&#xff1a; envp表&…

28.<Spring博客系统④(使用MD5摘要算法对数据库密码进行加密)>

密码算法简介 1.对称加密算法&#xff1a;加密和解密算法一样 2.非对称加密算法&#xff1a;公钥加密、私钥解密 3.摘要算法&#xff1a;不能解密&#xff0c;不可逆 简单介绍了解一下&#xff1a; 一、对称密码算法 是指加密秘钥和解密秘钥相同的密码算法. 常见的对称密码算法…

如何用GPT-4o解读视频

OpenAI在去年推出的GPT-4V已经支持了多模态识别&#xff0c;但一直仅限于图片输入&#xff0c;不支持视频。相比之下&#xff0c;Google的Gemini早已支持视频识别。最近&#xff0c;我司业务场景中出现了一个需要识别视频的需求&#xff0c;而我们只采购了GPT-4o模型。这就引发…

计算机毕业设计Python美食推荐系统 美团爬虫 美食可视化 机器学习 深度学习 混合神经网络推荐算法 Hadoop Spark 人工智能 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…