一些常用的react hooks以及各自的作用

一些常用的react hooks以及各自的作用

  • 一、React Hooks是什么
  • 二、一些常用的Hooks以及各自的作用
    • 1、useState
    • 2、useEffect
    • 3、useContext
    • 4、useMemo
    • 5、useCallback
    • 6、useReducer
    • 7、useRef

一、React Hooks是什么

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

至于为什么引入hook,官方给出的动机是解决长时间使用和维护react过程中常遇到的问题,例如:

  • 难以重用和共享组件中的与状态相关的逻辑
  • 逻辑复杂的组件难以开发与维护,当我们的组件需要处理多个互不相关的 local state 时,每个生命* 周期函数中可能会包含着各种互不相关的逻辑在里面
  • 类组件中的this增加学习成本,类组件在基于现有工具的优化上存在些许问题
  • 由于业务变动,函数组件不得不改为类组件等等

在以前,函数组件也被称为无状态的组件,只负责渲染的一些工作

因此,现在的函数组件也可以是有状态的组件,内部也可以维护自身的状态以及做一些逻辑方面的处理

二、一些常用的Hooks以及各自的作用

1、useState

创建数据状态,方法里的参数为state默认的值,返回值是一个数组,第一个值为当前的state,第二个值为更新state的函数

import React, { useState } from 'react';function Example() {// 声明一个叫 "count" 的 state 变量const [count, setCount] = useState(0);return (<div><p>You clicked {count} times</p ><button onClick={() => setCount(count + 1)}>Click me</button></div>);
}

2、useEffect

可以进行带有副作用的操作,useEffect第一个参数接受一个回调函数,第二个参数是一个数组,数组元素指定特定值是否在两次渲染中发生变化,没有变化则跳过effect的调用

import { useEffect, useState } from "react";
export default function App() {const [count, setCount] = useState(0)const handleIncrement = () => setCount(count + 1)const handleDecrement = () => setCount(count - 1)useEffect(() => {console.log('useEffect');}, [count])return (<div style={{ padding: 10 }}><button onClick={handleIncrement}>+</button><span>{count}</span><button onClick={handleDecrement}>-</button></div>);
}

3、useContext

用作组件通信

import { createContext, useContext } from "react";export function Section({ children }) {const level = useContext(LevelContext);return (<section className="section"><LevelContext.Provider value={level + 1}>{children}</LevelContext.Provider></section>);
}export function Heading({ children }) {const level =  useContext(LevelContext);switch (level) {case 1:return <h1>{children}</h1>;case 2:return <h2>{children}</h2>;case 3:return <h3>{children}</h3>;case 4:return <h4>{children}</h4>;case 5:return <h5>{children}</h5>;case 6:return <h1>{children}</h1>;default:throw Error("未知的 level: " + level);}
}const LevelContext = createContext(0);export default function App() {return (<div><Section><Heading>主标题</Heading><Section><Heading>副标题</Heading><Heading>副标题</Heading><Heading>副标题</Heading><Section><Heading>子标题</Heading><Heading>子标题</Heading><Heading>子标题</Heading><Section><Heading>子子标题</Heading><Heading>子子标题</Heading><Heading>子子标题</Heading></Section></Section></Section></Section></div>);
}

4、useMemo

用作数据缓存

import { useMemo, useState } from "react";function DoSomeMath({value}){const result = useMemo(() => {console.log('DoSomeMath执行了');let result = 0for(let i = 0; i < 1000000; i++){result += value * 2}return result}, [value])return (<div><p>输入内容:{value}</p><p>经过复杂计算的数据:{result}</p></div>)
}export default function App() {const [inputValue, setInputValue] = useState(5)const [count, setCount] = useState(0)return (<div><p>count的值为:{count}</p><button onClick={() => setCount(count  + 1)}>点击更新</button><br/><br/><input type="number"value={inputValue}onChange={(e) => setInputValue(parseInt(e.target.value))}/><DoSomeMath value={inputValue}/></div>);
}

5、useCallback

用作函数缓存

import { memo, useCallback, useState } from "react";// memo将组件变更为一个记忆组件,如果向这个组件传入的prop没有出现变话,它就不会受到父组件更新的影响
const Button = memo(function ({ onClick }) {console.log("Button渲染了");return <button onClick={onClick}>子组件</button>;
}); export default function App() {const [count, setCount] = useState(0)const handleClick = useCallback(() => {console.log("点击按钮");}, []);const handleUpdate = () => {setCount(count + 1)}return (<div><p>Count:{count}</p><button onClick={handleUpdate}>点击</button><br /><Button onClick={handleClick} /></div>);
}

6、useReducer

用作state的统一管理状态,可用useState代替

import { useReducer } from "react";
function countReducer(state, action){switch (action.type){case "increment":return state + 1case "decrement":return state - 1default: throw new Error()}
}
export default function App(){// 计数器// const [count, setCount] = useState(0)// const handleIncrement = () => setCount(count + 1)// const handleDecrement = () => setCount(count - 1)const [state, dispatch] = useReducer(countReducer, 0);const handleIncrement = () => dispatch({ type: "increment" });const handleDecrement = () => dispatch({ type: "decrement" });return (<div style={{ padding: 10 }}><button onClick={handleIncrement}>+</button>{/* <span>{count}</span> */}<span>{state}</span><button onClick={handleDecrement}>-</button></div>);
}

7、useRef

用作获取DOM结构和引用之前的状态值

// react hooks,useRef,引用之前的状态值
import { useRef, useState } from "react";export default function App(){const [count, setCount] = useState(0)const prevCount = useRef()function handleClick(){prevCount.current = countsetCount(count + 1)}return (<div style={{ padding: 10 }}><p>最新的count:{count}</p><p>上次的count:{prevCount.current}</p><button onClick={handleClick}>增大的count</button></div>);
}
// react hooks,useRef,引用页面中的标签
import { useRef } from "react";export default function App(){const inputRef = useRef(null)function handleClick(){inputRef.current.focus()}return (<div style={{ padding: 10 }}><input type="text" ref={inputRef} /><button onClick={handleClick}>增大的count</button></div>);
}
// react hooks,useRef,引用页面中的其他组件进行子组件功能访问
import { forwardRef, useImperativeHandle, useRef } from "react";
const Child = forwardRef(function (props, ref) {useImperativeHandle(ref, () => ({// 暴露父组件的方法myFn: () => {console.log("子组件的myFn方法");},}));return <div>子组件</div>;
});export default function App() {const childRef = useRef();function handleClick() {childRef.current.myFn()}return (<div><Child ref={childRef} /><button onClick={handleClick}>按钮</button></div>);
}

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

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

相关文章

不用买PSP,画质甚至更好,这款免费神器让你玩遍经典游戏

作为掌机游戏爱好者的福音&#xff0c;PPSSPP模拟器为玩家带来了前所未有的PSP游戏体验&#xff0c;彻底改变了掌机游戏的体验方式。这款精湛的软件不仅完美复刻了PSP主机的游戏体验&#xff0c;更通过先进的模拟技术&#xff0c;将经典游戏提升到了全新的高度。对于那些珍藏PS…

lua学习笔记---面向对象

在 Lua 中&#xff0c;封装主要通过元表&#xff08;metatable&#xff09;来实现。元表可以定义 __index、__newindex、__call 等元方法来控制对表的访问和赋值行为。 __index 元方法&#xff1a;当尝试访问一个不存在的键时&#xff0c;Lua 会查找元表的 __index 字段。如果 …

第15课 算法(下)

掌握冒泡排序、选择排序、插入排序、顺序查找、对分查找的的基本原理&#xff0c;并能使用这些算法编写简单的Python程序。 一、冒泡排序 1、冒泡排序的概念 冒泡排序是最简单的排序算法&#xff0c;是在一列数据中把较大&#xff08;或较小&#xff09;的数据逐次向右推移的…

golang通用后台管理系统03(登录校验,并生成token)

代码 package serviceimport ("fmt"//"fmt""gin/common""gin/config"sysEntity "gin/system/entity"sysUtil "gin/system/util""github.com/gin-gonic/gin""log" )func Login(c *gin.Contex…

Java环境下配置环境(jar包)并连接mysql数据库

目录 jar包下载 配置 简单连接数据库 一、注册驱动&#xff08;jdk6以后会自动注册&#xff09; 二、连接对应的数据库 以前学习数据库就只是操作数据库&#xff0c;根本不知道该怎么和软件交互&#xff0c;将存储的数据读到软件中去&#xff0c;最近学习了Java连接数据库…

快速遍历包含合并单元格的Word表格

Word中的合并表格如下&#xff0c;现在需要根据子类&#xff08;例如&#xff1a;果汁&#xff09;查找对应的品类&#xff0c;如果这是Excel表格&#xff0c;那么即使包含合并单元格&#xff0c;也很容易处理&#xff0c;但是使用Word VBA进行查找&#xff0c;就需要一些技巧。…

「C/C++」C/C++标准库 之 #include<ctime> 时间日期库

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

写论文随想(整理我自己的感悟)(不断更新中,废案按照删除号标记)

写论文随想&#xff08;整理我自己的感悟)&#xff08;不断更新中&#xff0c;废案按照删除号标记&#xff09; 论文的所有内容&#xff0c;都是为了服务于自己的创新点&#xff0c;只要整个文章围绕这个创新点讲好了&#xff0c;一篇自己满意的文章就成了。这也就是我现在的目…

使用wordcloud与jieba库制作词云图

目录 一、WordCloud库 例子&#xff1a; 结果&#xff1a; 二、Jieba库 两个基本方法 jieba.cut() jieba.cut_for_serch() 关键字提取&#xff1a; jieba.analyse包 extract_tags() 一、WordCloud库 词云图&#xff0c;以视觉效果提现关键词&#xff0c;可以过滤文本…

深入解析缓存模式下的数据一致性问题

今天&#xff0c;我们来聊聊常见的缓存模式和数据一致性问题。 常见的缓存模式有&#xff1a;Cache Aside、Read Through、Write Through、Write Back、Refresh Ahead、Singleflight。 缓存模式 Cache Aside 在 Cache Aside 模式中&#xff0c;是把缓存当做一个独立的数据源…

第四篇: 用Python和SQL在BigQuery中进行基础数据查询

用Python和SQL在BigQuery中进行基础数据查询 在大数据分析领域&#xff0c;Google BigQuery 提供了一种快速且经济高效的数据处理方式。对于想要使用SQL查询大规模数据的读者来说&#xff0c;BigQuery的公共数据集资源丰富、操作简便&#xff0c;是学习和实践SQL基础操作的理想…

Spring学习笔记_19——@PostConstruct @PreDestroy

PostConstruct && PreDestroy 1. 介绍 PostConstruct注解与PreDestroy注解都是JSR250规范中提供的注解。 PostConstruct注解标注的方法可以在创建Bean后在为属性赋值后&#xff0c;初始化Bean之前执行。 PreDestroy注解标注的方法可以在Bean销毁之前执行。 2. 依赖…

11.4模拟赛总结

文章目录 时间安排成绩反思 时间安排 7 : 40 − 8 : 00 7:40 - 8:00 7:40−8:00 开题。把题都看了一遍。 T 1 T1 T1 看起来有点神秘。 T 2 T2 T2 想很难的构造。 T 3 T3 T3 看起来像比较正常的计数题。 T 4 T4 T4 应该是扫描线 8 : 00 − 9 : 20 8:00 - 9:20 8:00−9:20 尝试…

ffmpeg视频滤镜:膨胀操作-dilation

滤镜介绍 dilation 官网链接 > FFmpeg Filters Documentation 膨胀滤镜会使图片变的更亮&#xff0c;会让细节别的更明显。膨胀也是形态学中的一种操作&#xff0c;在opencv中也有响应的算子。此外膨胀结合此前腐蚀操作&#xff0c;可以构成开闭操作。 开操作是先腐蚀…

多线程和线程同步基础篇学习笔记(Linux)

大丙老师教学视频&#xff1a;10-线程死锁_哔哩哔哩_bilibili 目录 大丙老师教学视频&#xff1a;10-线程死锁_哔哩哔哩_bilibili 线程概念 为什么要有线程 线程和进程的区别 在处理多任务的时候为什么线程数量不是越多越好? Linux提供的线程API 主要接口 线程创建 pth…

jeecgbootvue2菜单路由配置静态文件夹(public)下的html

需求:想要在菜单配置src/assets/iconfont/chart.html显示页面(目的是打包上线以后运维依然可以修改数据) 官网没有相关数据&#xff1a;菜单配置说明 JeecgBoot 开发文档 看云 问题现象: 我把文件放在src/assets/iconfont/chart.html然后在vue中作为 iframe 的 src 属性&am…

3种AI黑科技,让照片中的人物开口说话的简易方法,快进来学!

本文背景 用AI工作这么久了&#xff0c;我经常碰到各种关于AI的问题&#xff0c;比如制作让照片中人物开口说话的数字人。 很多小伙伴想知道是怎么弄的&#xff0c;不知从何下手。不过不用担心&#xff0c;今天就给大家带来三种实用的方法&#xff0c;快来一起试试吧。 首先是腾…

【docker compose】docker compose的hello world

安装docker desktop后在终端使用以下命令&#xff0c;代表安装成功&#xff0c;并查看当前安装的版本 docker-compose --version示例docker-compose.yml文件 version: 3.8 # 指定 Docker Compose 文件的版本services:scau_jwc: # 定义一个名为 scau_jwc 的服务image: scau_…

【js逆向学习】某多多anti_content逆向(补环境)

文章目录 声明逆向目标逆向分析逆向过程总结 声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;不提供完整代码&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的…

【C++】动态内存

一、内存区域分布 首先我们来看一段代码并尝试解决以下问题&#xff1a; 1. GlobalVar是全局变量&#xff0c;存储在数据段&#xff08;静态区&#xff09;&#xff0c;选C。2. staticGlobalVar是静态全局变量&#xff0c;也存储在数据段&#xff08;静态区&#xff09;&#x…