当前位置: 首页 > news >正文

react:React Hook函数

使用规则

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

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

基础Hook 函数

useState

useState是一个hook函数,它允许我们向组件中添加一个状态变量,从而控制影响组件的渲染结果

示例1

function App() {// 创建一个状态变量// count: 状态变量,setCount: 更新状态变量的函数const [count, setCount] = useState(0)return (<div><p>当前数值是:{count}</p><button onClick={() => setCount(count + 1)}>加一</button></div>)
}

在这里插入图片描述

示例2

function App() {const [userName, setUserName] = useState("111");return (<div><inputtype="text"value={userName}placeholder="请输入"onChange={(e) => setUserName(e.target.value)}/><div>当前输入值是:{userName}</div></div>);
}

在这里插入图片描述

注意:

  • react中,状态被认为是只读的,直接修改状态不能引发视图的更新
  • 对于对象类型的状态变量,应该始终传给set方法一个全新的对象来进行修改
function App() {const [form, setForm] = useState({age: 0})return (<div><p>当前年龄是:{form.age}</p><button onClick={() => setForm({...form,age: form.age + 1})}>加一</button></div>)
}

useRef

获取、操作DOM

function App() {// 使用 useRef生成ref对象,并绑定到dom上const inputRef = useRef(null);// 获取domconst getDom = () => {console.log(inputRef.current);};return (<div><input type="text" ref={inputRef} placeholder="请输入" /><button onClick={getDom}>获取dom</button></div>);
}

在这里插入图片描述

useEffect

useEffect是一个React Hook函数,用于在React组件中创建不是由事件引起而是由渲染本身引起的操作,比如发送AJAX请求、更改DOM

function App() {const [content, setContent] = useState("");const [note, setNote] = useState("");useEffect(() => {// 获取每日英语function getEnglish() {fetch("https://api.oioweb.cn/api/common/OneDayEnglish").then((res) => res.json()).then((data) => {console.log(data);setContent(data.result.content);setNote(data.result.note);});}getEnglish();}, []);return (<div><div>英文:{content}</div><div>翻译:{note}</div></div>);
}

在这里插入图片描述

不同依赖项说明

  • 没有依赖项,组件初始渲染+组件更新时执行
  • 空数组依赖,只在初始渲染时执行一次
  • 添加特定依赖项,组件初始渲染+特性依赖项变化时执行

没有依赖项

function App() {const [content, setContent] = useState(0);useEffect(() => {console.log("副作用执行了");});return (<div><button onClick={() => setContent(content + 1)}>{content}</button></div>);
}

空数组依赖

function App() {const [content, setContent] = useState(0);useEffect(() => {console.log("副作用执行了");}, []);return (<div><button onClick={() => setContent(content + 1)}>{content}</button></div>);
}

特性依赖变化

function App() {const [content, setContent] = useState(0);useEffect(() => {console.log("副作用执行了");}, [content]);return (<div><button onClick={() => setContent(content + 1)}>{content}</button></div>);
}

清除副作用

useEffect中编写的由渲染本身引起的对接组件外部的操作, 社区也叫做副作用操作,比如在useEffect中开启了一个定时器,我们想在组件卸载时把这个定时器再清理掉,这个过程就是清除副作用。

useEffect(() => {console.log("副作用执行了");return () => {console.log("清除副作用");};
}, []);

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

function App() {const [show, setShow] = useState(true);return (<div>父组件<button onClick={() => setShow(false)}>卸载Son组件</button>{show && <Son />}</div>);
}
function Son() {const [currentDate, setCurrentDate] = useState("");useEffect(() => {const timer = setInterval(() => {const newDate = new Date().toLocaleTimeString();setCurrentDate(newDate);console.log("当前时间:", newDate);}, 1000);return () => {// 不清除副作用,即使组件不适用了,定时器还会执行clearInterval(timer);};}, []);return (<div><div>子组件</div><div>当前时间是:{currentDate}</div></div>);
}

在这里插入图片描述

自定义Hook

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

function App() {const [state, toggle] = useToggle()return (<div>{ state && <div>这是一个div</div> }<button onClick={toggle}>切换</button></div>)
}function useToggle(){// 可复用的逻辑代码const [state, setState] = useState(true)const toggle = () => {setState(!state)}// 那些状态和方法需要在其他组件中使用,则返回return [state, toggle]
}

在这里插入图片描述

通用思路

  • 声明一个以use大头的函数
  • 在函数体内封装可以复用的逻辑
  • 将组件中用的的状态或者回调函数return出去(对象或者数组形式)
  • 在那个组件中用到这个逻辑,就执行这个函数,结构出来状态和回调进行使用
function App() {const [content, note] = useOneDayEnglish();return (<div><div>英文:{content}</div><div>翻译:{note}</div></div>);
}function useOneDayEnglish() {const [content, setContent] = useState("");const [note, setNote] = useState("");useEffect(() => {// 获取每日英语function getEnglish() {fetch("https://api.oioweb.cn/api/common/OneDayEnglish").then((res) => res.json()).then((data) => {console.log(data);setContent(data.result.content);setNote(data.result.note);});}getEnglish();}, []);return [content, note];
}

在这里插入图片描述

相关文章:

  • 【iOS】计算器的仿写
  • 秦巴山区SHP格式矢量范围
  • OpenCV视频I/O(4)视频采集类VideoCapture之获取异常处理模式函数getExceptionMode()的使用
  • PHP的guzzlehttp/guzzle库在碰到各种异常时的场景
  • 【rust】 基于rust编写wasm,实现markdown转换为html文本
  • 智驭未来·电网负荷智控系统
  • <<迷雾>> 第 2 章 用电来表示数 示例电路
  • 700. 二叉搜索树中的搜索
  • 【JAVA】算法笔记
  • pkg升级导致xfce虚拟终端无法启动甚至xfce挂死无法登入@FreeBSD(未解决)
  • Linux安装JDK及配置环境变量超详细教程
  • C++那些你不得不知道的(2)
  • 3D Slicer医学图像全自动AI分割组合拳-MONAIAuto3DSeg扩展
  • QT--基础
  • C++编程:实现简单的高精度时间日志记录小程序
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CNN 在图像分割中的简史:从 R-CNN 到 Mask R-CNN
  • interface和setter,getter
  • js数组之filter
  • JS字符串转数字方法总结
  • Markdown 语法简单说明
  • MySQL QA
  • Python3爬取英雄联盟英雄皮肤大图
  • Shell编程
  • ubuntu 下nginx安装 并支持https协议
  • 代理模式
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前嗅ForeSpider采集配置界面介绍
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 山寨一个 Promise
  • 系统认识JavaScript正则表达式
  • 阿里云API、SDK和CLI应用实践方案
  • 如何用纯 CSS 创作一个货车 loader
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #《AI中文版》V3 第 1 章 概述
  • #13 yum、编译安装与sed命令的使用
  • #stm32整理(一)flash读写
  • $.ajax,axios,fetch三种ajax请求的区别
  • (3)llvm ir转换过程
  • (4) PIVOT 和 UPIVOT 的使用
  • (70min)字节暑假实习二面(已挂)
  • (附源码)ssm高校志愿者服务系统 毕业设计 011648
  • (回溯) LeetCode 78. 子集
  • (九)信息融合方式简介
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (一)u-boot-nand.bin的下载
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil