React 内置的Hook学习
useState:管理组件状态
useState 是一个用于在函数组件中添加状态的 Hook。它允许你在函数组件中声明一个状态变量,并提供一个更新该状态的方法,其中与组件生命周期的关系:
- 初始化:当组件首次渲染时,
useState返回的初始状态值。 - 更新:当状态更新时,React 会重新渲染组件,并使用新的状态值。
const [state, setState] = useState(initialState);// state:当前状态的值。
// setState:更新状态的函数。
// initialState:初始状态的值。
import React, { useState } from 'react';function Counter() {const [count, setCount] = useState(0);const incrementCount = () => {setCount(count + 1);};return (<div><h1>Count: {count}</h1><button onClick={incrementCount}>+1</button></div>);
}export default Counter;
useEffect:用于在函数组件中执行副作用操作
useEffect 是一个用于在函数组件中执行副作用操作的 Hook。它可以替代类组件中的 componentDidMount、componentDidUpdate 和 componentWillUnmount 生命周期方法,其中与组件生命周期的关系:
- 组件挂载:当组件首次渲染时,
useEffect的回调函数会被执行。 - 组件更新:当组件重新渲染且依赖数组中的值发生变化时,
useEffect的回调函数会被执行。 - 组件卸载:当组件卸载时,
useEffect返回的清理函数会被执行。
useEffect(() => {// 副作用操作return () => {// 清理操作};
}, [dependencies]);/*** () => {}:副作用操作的回调函数。* return () => {}:可选的清理函数,用于在组件卸载或下次渲染前执行清理操作。* [dependencies]:依赖数组,用于控制何时触发副作用操作。空数组 [] 表示只在组件挂载和卸载时执行。*/
import React, { useState, useEffect } from 'react';function UserInfo() {const [user, setUser] = useState(null);const [loading, setLoading] = useState(true);const [error, setError] = useState(null);useEffect(() => {const fetchUser = async () => {try {const response = await fetch('https://jsonplaceholder.typicode.com/users/1');if (!response.ok) {throw new Error('Network response was not ok');}const data = await response.json();setUser(data);} catch (error) {setError(error);} finally {setLoading(false);}};fetchUser();// 清理函数return () => {console.log('Cleanup function called');};}, []); // 空依赖数组表示只在组件挂载和卸载时执行if (loading) return <p>Loading...</p>;if (error) return <p>Error: {error.message}</p>;return (<div><h1>User Information</h1><p>Name: {user.name}</p><p>Email: {user.email}</p><p>Phone: {user.phone}</p><p>Website: {user.website}</p></div>);
}export default UserInfo;
useMemo:优化性能,避免不必要的重新计算
useMemo 是一个用于 memoization(记忆化)的 Hook。它可以在某些情况下避免昂贵的计算,从而提高性能,与组件生命周期的关系:
- 初始化:当组件首次渲染时,
useMemo会计算并返回结果。 - 更新:当依赖数组中的值发生变化时,
useMemo会重新计算并返回新的结果。 - 不变:当依赖数组中的值没有变化时,
useMemo会返回上次计算的结果,避免重新计算。
const memoizedValue = useMemo(() => {// 计算结果
}, [dependencies]);// () => {}:计算结果的回调函数。// [dependencies]:依赖数组,用于控制何时重新计算。即当依赖数组中的值发生变化时,才会重新计算。
import React, { useState, useMemo } from 'react';function ExpensiveComponent({ count }) {const expensiveCalculation = useMemo(() => {let result = 0;for (let i = 0; i < 1000000; i++) {result += i * count;}return result;}, [count]);return <div>Result: {expensiveCalculation}</div>;
}function App() {const [count, setCount] = useState(0);return (<div><ExpensiveComponent count={count} /><button onClick={() => setCount(count + 1)}>+1</button></div>);
}export default App;
useCallback:优化性能,避免不必要的函数重新创建
useCallback 是一个用于 memoization(记忆化)函数的 Hook。它可以在某些情况下避免不必要的函数重新创建,从而提高性能,与组件生命周期的关系:
- 初始化:当组件首次渲染时,
useCallback会返回一个 memoized 的函数。 - 更新:当依赖数组中的值发生变化时,
useCallback会返回一个新的函数。 - 不变:当依赖数组中的值没有变化时,
useCallback会返回上次 memoized 的函数,避免重新创建。
const memoizedCallback = useCallback(() => {// 回调函数
}, [dependencies]);// () => {}:回调函数。// [dependencies]:依赖数组,用于控制何时重新创建回调函数。即当依赖数组中的值发生变化时,才会返回新的函数。
import React, { useState, useCallback } from 'react';function ChildComponent({ onIncrement }) {return (<button onClick={onIncrement}>+1</button>);
}function ParentComponent() {const [count, setCount] = useState(0);const handleIncrement = useCallback(() => {setCount(count + 1);}, [count]);return (<div><ChildComponent onIncrement={handleIncrement} /><p>Count: {count}</p></div>);
}export default ParentComponent;
应用
import React, { useState, useEffect, useMemo, useCallback } from "react";const UserInfo = () => {const [user, setUser] = useState(null);const [loading, setLoading] = useState(true);const [error, setError] = useState(null);// 定义 fetchUser 函数const fetchUser = async () => {try {const response = await fetch("https://jsonplaceholder.typicode.com/users/1");if (!response.ok) {throw new Error("Network response was not ok");}const data = await response.json();setUser(data);} catch (error) {setError(error);} finally {setLoading(false);}};// 使用 useEffect 替代 componentDidMount 和 componentDidUpdateuseEffect(() => {fetchUser();// 清理函数,替代 componentWillUnmountreturn () => {console.log("Cleanup function called");};}, []); // 空依赖数组表示只在组件挂载和卸载时执行// 使用 useMemo 优化性能,避免不必要的重新计算const userInfo = useMemo(() => {if (!user) return null;return (<div><h1>User Information</h1><p>Name: {user.name}</p><p>Email: {user.email}</p><p>Phone: {user.phone}</p><p>Website: {user.website}</p></div>);}, [user]);// 使用 useCallback 优化性能,避免不必要的函数重新创建const handleRefresh = useCallback(() => {setLoading(true);setUser(null);setError(null);fetchUser(); // 调用 fetchUser 函数重新获取数据}, [fetchUser]); // 添加 fetchUser 作为依赖if (loading) return <p>Loading...</p>;if (error) return <p>Error: {error.message}</p>;return (<div>{userInfo}<button onClick={handleRefresh}>Refresh</button></div>);
};export default UserInfo;
总结
useState:用于管理组件状态,在组件初始化和更新时生效。useEffect:用于执行副作用操作,如数据获取和清理,可以在组件挂载、更新和卸载时生效。useMemo:用于 memoization,避免不必要的计算,可以在组件初始化和依赖变化时生效。useCallback:用于 memoization,避免不必要的函数重新创建,可以在组件初始化和依赖变化时生效。
相关文章:
React 内置的Hook学习
useState:管理组件状态 useState 是一个用于在函数组件中添加状态的 Hook。它允许你在函数组件中声明一个状态变量,并提供一个更新该状态的方法,其中与组件生命周期的关系: 初始化:当组件首次渲染时,useS…...
Flutter Navigator2.0的原理和Web端实践
01 背景与动机 在Navigator 2.0推出之前,Flutter主要通过Navigator 1.0和其提供的 API(如push(), pop(), pushNamed()等)来管理页面路由。然而,Navigator 1.0存在一些局限性,如难以实现复杂的页面操作(如移…...
初次使用uniapp编译到微信小程序编辑器页面空白,真机预览有内容
uniapp微信小程序页面结构 首页页面代码 微信小程序模拟器 模拟器页面为空白时查了下,有几个说是“Hbuilder编译的时候应该编译出来一个app.js文件 但是却编译出了App.js”,但是我的小程序结构没问题,并且真机预览没有问题 真机调试 根据defi…...
【HF设计模式】03-装饰者模式
声明:仅为个人学习总结,还请批判性查看,如有不同观点,欢迎交流。 摘要 《Head First设计模式》第3章笔记:结合示例应用和代码,介绍装饰者模式,包括遇到的问题、遵循的 OO 原则、达到的效果。 …...
【人工智能-中级】模型部署与优化:从本地实验到云端与边缘部署
模型部署与优化:从本地实验到云端与边缘部署 在机器学习和深度学习模型训练完成后,如何高效、稳定地将模型部署到生产环境中,是实际应用中的关键环节。模型部署不仅涉及技术实现,还需要考虑性能优化、资源管理和安全性等多方面因素。本文将全面探讨模型部署与优化的相关内…...
Jenkins 编写Pipeline 简介及使用初识详解
一、Jenkins Pipeline简介 Jenkins Pipeline是Jenkins的一个重要功能,Jenkins 2.0 以上才会有,一系列 Jenkins 插件将整个持续集成用解释性代码 Jenkinsfile 来描述,它允许开发者以代码的方式定义整个持续集成和交付(CI/CD)流程,包括构建、测试、部署和监控等步骤。Jenk…...
uboot移植网络驱动过程,无法ping通mx6ull和ubuntu问题解决方案
开发板:mx6ull-ALPHA_V2.4 ubuntu版本:20.04 1.现在虚拟机设置中添加网路适配器用于开启桥接模式 2.在编辑中打开“虚拟网络编辑器” 我的电脑本身只有VMnet1和VMnet8,需要底下“添加网络”,增加这个VMnet0 ,并且进行…...
精准预测美国失业率和贫困率,谷歌人口动态基础模型PDFM已开源,可增强现有地理空间模型
疾病、经济危机、失业、灾害……人类世界长期以来被各种各样的问题「侵扰」,了解人口动态对于解决这类复杂的社会问题至关重要。 政府相关人员可以通过人口动态数据来模拟疾病的传播,预测房价和失业率,甚至预测经济危机。然而,在过…...
C#速成(文件读、写操作)
导包 using System.IO;1、写入文件(重要) StreamWriter sw new StreamWriter("C:\Users\29674\Desktop\volumn.txt");//创建一个TXT的文件 sw.WriteLine(textBox2.Text);//写入文件的内容 sw.Close();//关闭2、读取文件(不重要&…...
SQL server学习03-创建和管理数据表
目录 一,SQL server的数据类型 1,基本数据类型 2,自定义数据类型 二,使用T-SQL创建表 1,数据完整性的分类 2,约束的类型 3,创建表时创建约束 4,任务 5,由任务编写…...
【UE5 “RuntimeLoadFbx”插件】运行时加载FBX模型
前言 为了解决在Runtime时能够直接根据FBX模型路径直接加载FBX的问题,推荐一款名为“RuntimeLoadFBX”的插件。 用法 插件用法如下,只需要指定fbx的地址就可以在场景中生成Actor模型 通过指定输入参数“Cal Collision”来设置FBX模型的碰撞 还可以通过…...
【潜意识Java】深入理解 Java 面向对象编程(OOP)
目录 什么是面向对象编程(OOP)? 1. 封装(Encapsulation) Java 中的封装 2. 继承(Inheritance) Java 中的继承 3. 多态(Polymorphism) Java 中的多态 4. 抽象&…...
windows同时使用多个网卡
windows同时链接了有线网络,多个无线网卡,默认会使用有线网络,如果想要局域网内使用某个特定的网络,可以设置静态ip 1. 首先删除原来的静态网络(不冲突可以不删除),我这里usb无线网卡切换过usb插口,这里需要删除原来的. 使用 route print 查看接口列表及静态路由信息 route p…...
Spark执行计划解析后是如何触发执行的?
在前一篇Spark SQL 执行计划解析源码分析中,笔者分析了Spark SQL 执行计划的解析,很多文章甚至Spark相关的书籍在讲完执行计划解析之后就开始进入讲解Stage切分和调度Task执行,每个概念之间没有强烈的关联,因此这中间总感觉少了点…...
B4X编程语言:B4X控件方法汇总
1、AddNode、AddView方法 AddNode(Node As javafx.scence.Node,Left As Double,Top As Double,Width As Double,Height As Double) B4J控件 AddView(View As javafx.scence.Node,Left As Double,Top As Double,Width As Double,Height As Double) B4J的B4XView …...
基于XML配置Bean和基于XML自动装配
目录 基于XML配置Bean id分配规则 通过id获取bean 通过类型获取bean 通过C命名空间配置bean 使用C命名空间 通过P命名空间配置bean 通过util:list进行配置bean 指定id,直接ref引用过来 通过外部属性文件配置Bean Bean信息重用(继承)…...
全排列 dfs
给定一个由不同的小写字母组成的字符串,输出这个字符串的所有全排列。 我们假设对于小写字母有 a<b<…<y<z ,而且给定的字符串中的字母已经按照从小到大的顺序排列。 输入格式 输入只有一行,是一个由不同的小写字母组成的字符串…...
linux内存相关命令的尝试
文章目录 前言freeMem 部分的解释Swap 部分的解释 vmstatProcs (进程)Memory (内存)Swap (交换)IO (磁盘 I/O)System (系统)CPU (处理器) pidstat标题行解释数据列解释 sar字段含义解释示例分析 总结 前言 菜就多练,昨天看了一篇有关剖析 RocksDB 内存超限问题的文…...
Vue2 基础
Vue 2 是 Vue.js 的第二个主要版本,于 2016 年发布。它是一个渐进式的 JavaScript 框架,以其简单、灵活、易用性高而广受欢迎。Vue 2 主要专注于构建用户界面(UI),并且非常适合用于构建单页应用(SPA&#x…...
递归问题(c++)
递归设计思路 数列递归 : 如果一个数列的项与项之间存在关联性,那么可以使用递归实现 ; 原理 : 如果一个函数可以求A(n),那么该函数就可以求A(n-1),就形成了递归调用 ; 注意: 一般起始项是不需要求解的,是已知条件 这就是一个典型…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
