react Hooks都有些什么?分别有什么作用
- useState:用于在函数组件中添加 state 状态。
- useEffect: 用于处理函数组件中的副作用操作,如数据获取、DOM 操作等
- useMemo: 用于缓存计算结果,避免不必要的重复计算。
- useRef: 用于在函数组件中创建一个可变的引用,并在每次渲染之间保持其稳定性。
- useReducer: 用于使用 reducer 在函数组件中管理复杂的 state。
- useCallback: 用于缓存回调函数,避免不必要的重新渲染
- useContext: 用于访问 React Context API 中提供的值。
- useLayoutEffect: 类似于 useEffect,但它会在浏览器绘制更新屏幕之前同步执行 effect。
- uselmperativeHandle: 用于在父组件中访问子组件的实例方法。
- useDebugValue: 用于在 React Developer Tools 中为自定义 Hook 提供更好的错误提示.
先写常用的Hooks
一、useState初始化
useState (initialState)的第一个参数是初始状态。 返回的数组有两项:当前状态和状态更新函数,使用 setState(更新值)来更新状态值 基本用法一:
const [state,setState]=useState(值) // 返回一个state,以及更新state的函数
示例:
function App() {
const [state,setState]=useState(0)
const click=()=>{
setState(state+1) //点击一次+1
}
return (
<>
<Button onClick={click}>点击</Button>
</>
);
}
export default App;
如果需要根据先前的状态更新状态使用
基本用法二:
setState( preValue => {
preValue //上一次的值
return 值
}) // 返回一个state,以及更新state的函数
useState总结
1. useState 有2种初始化的方式
第一种 useState(值)
第二种 useState(() => {
写逻辑
return 值
})
2. useState 全都是异步的
修改完以后 如果想立刻获取上一次的值 可以使用 useState的 set方法 接收一个回调函数
setX(pre => {
// pre 就是上一的值
return pre
})
3. useState 为什么要做成异步的?
如果是同步, 比如我连续调用5次, 页面就会刷新5次, 浪费性能, 所以把它做成异步的, 对同一个值进行多次 setState, setState
的批量更新策略会对其进行覆盖 取最后一次的执行结果, 如果是同时 setState 多个不同的值, 在更新时会对其进行合并批量更新
二、useMemo
useMemo接收两个参数,分别是函数和一个数组(实际上是依赖),函数里return 函数,数组内存放依赖,使用方法与useEffect类似
举个例子,未写useMemo的:
import React, { useMemo, useState } from 'react';
import { Button } from 'antd';
function Memo() {
const [count, setCount] = useState(0);
const fn = () => {
console.log('执行了');
let num = 0;
for (let i = 0; i < x; i++) {
num += i;
}
return num;
};
const onClick = () => {
setCount(count + 1);
};
return (
<div>
<h1>num:{fn}</h1>
<h1>count:{count}</h1>
<Button onClick={onClick}>点击</Button>
</div>
);
}
export default Memo;
第一次执行结果 fn=49995000
没有useMemo的情况下 点击按钮 执行一次 fn就跟着执行一次 特别浪费性能
正确的使用:
const [x, setX] = useState(10000);
const fn = useMemo(() => {
console.log('执行了');
let num = 0;
for (let i = 0; i < x; i++) {
num += i;
}
return num;
}, [x]);
const onClick = () => {
setX(x + 1);
};
return (
<div>
<h1>num:{fn}</h1>
<h1>count:{x}</h1>
<Button onClick={onClick}>点击X</Button>
</div>
);
再次点击时useMemo监听x ----当 x 有变化就会重新继续执行fn函数
useMemo总结
useMemo 有2个参数 一个回调函数 一个依赖
回调函数里必须有 返回值, useMemo 的特性是 缓存 return 出来的值
如果依赖为空 useMemo 缓存的值永远不会改变
如果依赖改变 缓存的值会重新发生改变
useMemo例子
三、useCallback
用法: useCallback 有2个参数 第一个参数是一个回调函数 第二个参数是一个依赖, useCallback缓存一个函数 依赖为空
缓存的函数不会改变 依赖改变 缓存的函数就跟着改变
useCallback例子
![53X]0~(I_@533_YUOSP(LOH.png](p1-juejin.byteimg.com/tos-cn-i-k3…?)
四、useEffect
1、eEffect() 是 React 16.8 引入的一个 Hook,它用于处理函数式组件中的生命周期函数。
2、副作用指的是会对应用程序状态产生影响的任何操作。例如:修改DOM、发起网络请求等。
3、useEffect() 可以让你在函数组件中执行副作用操作,而无需使用类组件中的生命周期方法。它接受两个参数:回调函数和依赖项数组。
(3.1)、回调函数:这个函数会在每次组件渲染完成后执行。在这个函数中,你可以执行任何副作用操作,例如修改DOM或发起网络请求。
(3.2)依赖项数组:这个数组是可选的,包含了所有的依赖项。当依赖项发生变化时(即数组中的元素发生变化),React 将重新运行这个 useEffect 回调函数。如果不传递这个数组,那么每次组件渲染都会执行这个回调函数。
五、useRef
首先 const ref = useRef(可以给一个默认值), useRef 返回一个对象 这个对象的指针 不会改变
1. 可以获取DOM 节点 <div ref="ref" />
2. 可以获取上一次的值
useRef 例子
![HV8}K}XXT2K]U{AEQP4JUL.png