react常用hook(一)
创始人
2025-06-01 21:30:40

Hook 是 React 16.8 的新增特性。它可以让你在不编写 class 的情况下使用 state 以及其他的 React 特性。

理解:hook是react提供的函数API

官方提供的hook


基础hook


useState API

const [state, setState] = useState(initialState);
//返回state值  以及更新state的方法
在初始渲染期间,返回的状态 (state) 与传入的第一个参数 (initialState) 值相同。
setState 函数用于更新 state。它接收一个新的 state 值并将组件的一次重新渲染加入队列。
案例:
//引入 hook
import { useState } from "react";
//16.8
//useState 给函数组件提供state状态值
//useState  返回数组  [state状态值,更新状态值的方法]
export default () => {//定义状态  useState参数为初始值let [num, setNum] = useState(0);console.log("渲染",num);//定义+-事件//匿名函数写法// let handler = () => {};function handler(type) {switch (type) {case "decrement"://--num--;break;case "increment"://++num++;break;}setNum(num);}return (<>
数量:{num}
); }; //state状态值num===初始状态值 //state状态值首次编译创建一次。更新state状态值不会重新定义//案例中存在num++ 后置++ -- //整个程序运行存在异常。

函数组件中定义状态值

 //定义状态  useState参数为初始值let [num, setNum] = useState(0);let [isShow, setShow] = useState(true);let [arr, setArray] = useState([0, 1, 2, 3, 4]);let [stu, setStu] = useState({name: "小花",age: 18,});let [city, setCity] = useState([{ name: "西安市" }, { name: "咸阳市" }]);
注意使用useState定义数据state
//1.state状态值为普通变量  可以直接修改  可以让函数组件更新
//2.如果函数组件中定义的数据为对象或者数组//对象某个key修改stu.name = "小黑";setStu(stu)//数组某个索引值修改arr[0] = 11;setArray(arr);//以上两种写法不会导致函数组件更新//底层监听不到当前数据在变化,因为引用链没有断掉。建议断链:setStu({ ...stu, name: "小黑" });arr[0]=11;setArray([...arr]);

react中对象检测机制:

React 使用 Object.is 比较算法 来比较 state。 所以需要断链操作。

与 class 组件中的 setState 方法不同,useState 不会自动合并更新对象

函数组件中产生覆盖。

你可以用函数式的 setState 结合展开运算符来达到合并更新对象的效果。

意思是如果需要类似setState 对象合并。 使用函数式来处理。
//函数式写法 useState// setStu({ ...stu, name: "小黑" });setStu((state) => {//业务逻辑代码return { ...stu, name: "xiaohei" };});

useEffect

类似周期函数 常用hook 主要功能是用来处理副作用

  useEffect(() => {console.log("挂载");});//以上的这种用法 等待jsx模板编译挂载到页面之后执行外部的函数(类似挂载完成)//当前函数组件数据更新 可以当作更新完成//下面这种写法 外部函数执行一致。 内部返回的函数为处理副作用函数。//首次编译 处理副作用函数不执行。()useEffect(() => {console.log("挂载");//返回的函数为处理副作用函数return function (){console.log("处理副作用");}});//当前函数组件数据更新 函数组件重新编译  useEffect继续执行---先执行上次的副作用处理//作用:为防止内存泄漏,清除函数会在组件卸载前执行useEffect(() => {console.log("挂载");//返回的函数为处理副作用函数return function () {console.log("处理副作用");};});例如:useEffect(() => {console.log("挂载");let time = setInterval(() => {console.log("输出");}, 1000);//返回的函数为处理副作用函数return function () {console.log("处理副作用");clearInterval(time);};});//如果在子组件中使用useEffect 处理副作用useEffect(() => {console.log("挂载完成或者更新完成");//处理副作用和卸载之前return () => {console.log("处理副作用");};});console.log("渲染");//考虑当前组件卸载  处理副作用函数可以当作卸载之前使用//useEffect 可以代替组件的挂载完成和更新完成和卸载之前 三个周期。

useEffect 外部处理函数:与 componentDidMount、componentDidUpdate 不同的是,在浏览器完成布局与绘制之后,传给 useEffect 的函数会延迟调用。

演示useEffect的使用场景

类似挂载:

export default () => {//类似挂载完成周期  useEffect的函数是在挂载页面之后延迟执行useEffect(()=>{console.log("执行");});console.log("渲染");return (<>
测试
); };

类似更新:

export default () => {let [num, setNum] = useState(0);useEffect(() => {console.log("执行");});let update = () => {num++;setNum(num);};console.log("渲染");return (<>
测试-{num}
); }; //修改当前组件state 组件更新 执行useEffect中函数--功能类似更新完成

类似卸载之前:

官方解释是卸载之前处理副作用函数。处理当前组件副作用。

import { useEffect } from "react";export default () => {useEffect(() => {console.log("执行");return function () {console.log("处理副作用");};});console.log("渲染");return (<>
菜单
); }; //子组件首次挂载产生一个副作用处理函数 //直接子组件卸载 执行上次产生的副作用函数(类似卸载之前)

effect 的条件执行

默认情况下,effect 会在每轮组件渲染完成后执行。这样的话,一旦 effect 的依赖发生变化,它就会被重新创建。

在函数组件中具体到某个状态发生变化useEffect才执行。

给useEffect添加条件(让useEffect存在依赖项,依赖项发生变化的时候useEffect才重新定义执行)

useEffect 参数二:[]
用法:useEffect(() => {console.log("执行");//定义计时器let timer = setInterval(() => {console.log("计时器");}, 500);return function () {console.log("处理副作用");clearInterval(timer);};}, [num]);//依赖[]useEffect(() => {console.log("执行");//定义计时器let timer = setInterval(() => {console.log("计时器");}, 500);return function () {console.log("处理副作用");clearInterval(timer);};}, []);//依赖值为空 默认首次挂载之后执行其余不执行//存在多个依赖项useEffect(() => {console.log("执行");//定义计时器let timer = setInterval(() => {console.log("计时器");}, 500);return function () {console.log("处理副作用");clearInterval(timer);};}, [num,name]);

useEffect用法


调网络为例:
//引入获取验证码接口
import { useEffect } from "react";
import { getCaptcha } from "../network/user";
export default () => {useEffect(async () => {let res = await getCaptcha();console.log(res);}, []);return (<>
登录界面
); }; //官方警告
//引入获取验证码接口
import { useEffect } from "react";
import { getCaptcha } from "../network/user";
export default () => {useEffect(() => {async function request() {let res = await getCaptcha();console.log(res);}request();}, []);return (<>
登录界面
); };

相关内容

热门资讯

一种古老的蛋白质,打破了手性规... 有一种极为古老的蛋白质,它宛如自然界的神秘使者,悄然打破了手性规则。在漫长的岁月长河中,大多数蛋白质...
市值蒸发超20亿!光伏龙头被调... 6月3日,深交所发布公告称,将于6月16日对深证成指、创业板指、深证100等核心指数实施样本股定期调...
餐饮旅游概念股走强,南京商旅涨... 6月3日,餐饮旅游概念股走强,南京商旅涨停,金陵饭店、华立科技涨逾5%。
国内AI大模型技术崛起,半导体... 截至2025年6月3日 10:46,中证半导体产业指数(931865)强势上涨1.64%,成分股中巨...
“体育+商圈”跨界融合,济南潮... 6月1日晚,济南世茂广场中央舞台,激光划破夜空,5位潮流运动达人获颁“2025年济南潮流体育消费季推...
A股三大指数相继翻红,游戏、数... 格隆汇6月3日|A股三大指数相继翻红,游戏、数字货币、贵金属板块领涨。
原创 美... 美国关税再一次出现了大反转,特朗普的脸被打得啪啪响,但咱们可一定得把持住,千万别被带了节奏。 5月底...
华西证券:5月30日融券卖出2... 证券之星消息,5月30日,华西证券(002926)融资买入566.54万元,融资偿还1012.56万...
“投资于人”激发消费活力 李俊成 在加快构建新发展格局的大背景下,如何扩大内需、提振消费,成为推动经济高质量发展的重要课题。就...
佰维存储:5月30日融资买入3... 证券之星消息,5月30日,佰维存储(688525)融资买入3213.65万元,融资偿还3676.11...
A股,三大利好!“南哥”,刷爆... 题材火爆的时段又来了!早盘,三大题材类利好突袭市场。其中,江苏足球刷爆网络,其情绪也传递至A股。金陵...
安斯泰来中国加速度:创新生态协... 2024年,中国生物医药市场在“创新药”首次写入政府工作报告的政策东风下,创新药管线数量和资产质量持...
台积电2nm良率已达90%,美... 6月3日消息,据台媒报道,台积电美国亚利桑那州4nm晶圆厂已经量产,英伟达(NVIDIA) 的AI芯...
瀚蓝环境百亿并购正式完成,高效... 6月2日,瀚蓝环境(600323,SH)公告称,公司重大资产重组所有条件均已达成或被豁免,计划生效。...
创业板指半日涨0.73%,创新...   中新经纬6月3日电 3日上午,A股低开高走,创业板指领涨。截至午盘,上证指数涨0.48%,报33...
【午盘】A股早盘低开高走,大金... A股三大股指6月3日集体低开。早盘两市低开高走,三大股指很快转涨。从盘面上看,大金融领涨,银行股再度...
银行板块震荡走高 银行板块震荡... 【银行板块震荡走高】沪农商行涨停,渝农商行涨超6%,兴业银行涨超4%,上海银行、青岛银行、民生银行等...
MemeSwap带你从“听说”... 【台北/马来西亚讯】MemeSwap,这个以DeFi、社区治理与资产激励为核心的去中心化金融平台,正...
EDA概念股爆发,概伦电子涨逾... 6月3日,EDA概念股爆发,概伦电子涨逾14%,广立微涨逾5%,华大九天、安路科技涨逾4%。
估值432亿的全球龙头,英伟达... 英伟达作为全球领先的科技企业,其投资动作往往备受瞩目。如今,估值 432 亿的某全球龙头企业获得了英...
百亿敷尔佳掉进“网红陷阱” 敷... 作者:响马 | 编辑:小鱼“敷尔佳患上流量饥渴症。”好文3611字 | 6分钟阅读图源自敷尔佳官方微...
美国想用发动机换稀土?特朗普黔... 美国终于还是向C919下手了。据《纽约时报》等多家美媒报道,美国商务部暂停向中国商飞发放多项技术许可...
游戏板块早盘活跃,多只游戏ET... 6月3日,游戏板块早盘活跃,掌趣科技涨超10%,巨人网络涨停,多只游戏ETF涨超3%,截至发稿,华夏...
后物质时代的消费革命:卡牌热是... 在我们正儿八经开始分析卡游的这份招股书之前,不妨思考一个小问题:很多人在分析公司、特别是消费品公司的...
黄金再次站上3400美元关口,... 6月2日晚,受国际政治经济形势影响,COMEX黄金再次站上3400美元/盎司。ETF方面,黄金股票E...
新消费概念再度活跃 新消费概念... 【新消费概念再度活跃】休闲食品、美妆、饮料等方向领涨,若羽臣涨停,万辰集团涨超10%,双双创历史新高...
南京“以债换房”政策?官方辟谣... 南京“以债换房”政策?官方辟谣! 最近,南京楼市被一则“重磅消息”搅得沸沸扬扬——多个网络账号声称“...
港股走高,恒指、国指、恒生科技... 格隆汇6月3日|港股走高,恒指、国指、恒生科技指数均涨超1%。
乌“蛛网”行动打开未来作战“潘... 【环球时报特约记者 晨阳 环球时报记者 刘扬】乌克兰在大规模使用无人机发动特种攻击方面,再次震惊了世...