react Hook 其他Hook
其他 Hook
Reducer Hook
Flux:Facebook 出品的一个数据流框架
- 规定了数据是单向流动的
- 数据存储在数据仓库中(目前,可以认为 state 就是一个存储数据的仓库)
- action 是改变数据的唯一原因(本质上就是一个对象,action 有两个属性)
- type:字符串,动作的类型
- payload:任意类型,动作发生后的附加信息
- 例如,如果是添加一个学生,action 可以描述为:
{ type:"addStudent", payload: {学生对象的各种信息} }
- 例如,如果要删除一个学生,action 可以描述为:
{ type:"deleteStudent", payload: 学生id }
- 具体改变数据的是一个函数,该函数叫做 reducer
- 该函数接收两个参数
- state:表示当前数据仓库中的数据
- action:描述了如何去改变数据,以及改变数据的一些附加信息
- 该函数必须有一个返回结果,用于表示数据仓库变化之后的数据
- Flux 要求,对象是不可变的,如果返回对象,必须创建新的对象
- reducer 必须是纯函数,不能有任何副作用
- 该函数接收两个参数
- 如果要触发 reducer,不可以直接调用,而是应该调用一个辅助函数 dispatch
- 该函数仅接收一个参数:action
- 该函数会间接去调用 reducer,以达到改变数据的目的
Context Hook
获取上下文数据
1 | const value = useContext(MyContext); |
接收一个 context 对象(React.createContext 的返回值)并返回该 context 的当前值。当前的 context 值由上层组件中距离当前组件最近的 <MyContext.Provider> 的 value prop 决定。
1 | import React, { useContext } from "react"; |
Callback Hook
useCallback
用于得到一个固定引用值的函数,通常用来进行性能优化
useCallback:
该函数有两个参数:
- 函数,useCallback 会固定该函数的引用,只要依赖项没有发生变化,则始终返回之前函数的地址
- 数组,记录依赖项
1 | const memoizedCallback = useCallback(() => { |
Memo Hook
用于保持一些比较稳定的数据,通常用于性能优化
Ref Hook
useRef:
- 一个参数:默认值
- 返回值:一个固定的对象,
{current:值}, r 变更.current属性不会引发组件重新渲染。
1 | import React, { useRef } from "react"; |
1 | // 将useRef当成一个固定对象使用 |
ImperativeHandle Hook
useImperativeHandle 可以让你在使用 ref 时自定义暴露给父组件的实例值
useImperativeHandle(ref, createHandle, [deps])
参数一:Ref
参数二:一个函数,返回值可以通过ref获取
参数三:依赖列表,第一次运行之后,只有依赖项发生变化才会运行
index.js
1 | import React, { useImperativeHandle } from "react"; |
test.js
1 | import React, { useRef } from "react"; |
LayoutEffect Hook
useLayoutEffect
在浏览器渲染完之前运行,可能导致渲染阻塞
useLayoutEffect :完成了DOM改动,但还没呈现给用户,与类组件的componentDidMount和componentDidUpdate时间点一致useEffect 会在浏览器渲染完成,用户看到新的渲染结果后
应该尽量使用useEffect因为他不会导致渲染阻塞。
DebugValue Hook
usedebugvalue:
用于将自定义Hook的关联数据显示到调试栏