- useState: useState是用于声明一个状态变量的,用于为函数组件引入状态. useState 只接收一个参数,这个参数可以是数字、字符串、对象等任意值,用于初始化声明的状态变量。
也可以是一个返回初始值的函数,最好是函数,可在渲染时减少不必要的计算。返回一个长度为2的读写数组,数组的第一项是定义的状态变量本身,第二项是一个用来更新该状态变量的函数,约定是set前缀加上状态的变量名. useState Hook 中返回的 setState,并不会帮我们自动合并对象状态的属性;
setState中接收的对象参数如果地址没变的话会被React认为没有改变,因此不会引起视图的更新
- useReducer: useReducer 是 useState 的升级版。
在useState中返回的写接口中,我们只能传递最终的结果,在setN的内部也只是简单的赋值操作。 创建初始状态值initialState, 创建包含所有操作的 reducer(state, action) 函数,每种操作类型均返回新的 state 值 根据 initialState 和 reducer 使用 const [state, dispatch] = useReducer(reducer, initialState) 得到读写API调用写接口,传递的参数均挂在 action 对象上
- useContext: context是上下文的意思,上下文是局部的全局变量这个局部的范围由开发者自己指
- useEffect: effect是副作用的意思,对环境的改变就是副作用。副作用是函数式编程里的一个概念在React中,useEffect就是在每次render后执行的操作,相当于 afterRender, 接收的第一个参数是回调函数,第二个参数是回调时机。可用在函数组件中模拟生命周期。 如果同时出现多个 useEffect ,会按出现顺序依次执行
- useLayoutEffect useEffect总是在浏览器渲染完视图过后才执行,如果 useEffect 里面的回调函数有对 DOM 视图的操作,则会出现一开始是初始化的视图,后来执行了 useEffect里的回调后立马改变了视图的某一部分,会出现一个闪烁的状态。 为了避免这种闪烁,可以将副作用的回调函数提前到浏览器渲染视图的前面执行,当还没有将 DOM挂载到页面显示前执行Effect中对DOM进行操作的回调函数,则在浏览器渲染到页面后不会出现闪烁的状态。layout 是视图的意思,useLayoutEffect 就是在视图显示出来前执行的副作用。useEffect 和 useLayoutEffect就是执行的时间点不同,useLayoutEffect是在浏览器渲染前执行,useEffect 是在浏览器渲染后执行。
但二者都是在render函数执行过程中运行,useEffect是在render完毕后执行,useLayoutEffect是在render完毕前(视图还没渲染到浏览器页面上)执行。 因此 useLayoutEffect总是在useEffect前执行。 一般情况下,如果Effect中的回调函数中涉及到 DOM 视图的改变,就应该用 useLayoutEffect,如果没有,则用 useEffect。
- useRef useRef Hook是用来定义一个在组件不断render时保持不变的变量。组件每次 render后都会返回一个虚拟DOM,组件内对应的变量都只属于那个时刻的虚拟 DOM。useRef Hook就提供了创建贯穿整个虚拟DOM更新历史的属于这个组件的局部的全局变量。为了确保每次render后使用useRef获得的变量都能是之前的同一个变量,只能使用引用做到,因此,useRef 就将这个局部的全局变量的值存储到了一个对象中,属性名为:current useRef的current变化时不会自动render useRef可以将创建的 Refs对象通过ref属性的方式引用到DOM节点或者React实例。
- useCallback是将某个函数“放入到react底层原型链上,并返回该函数的索引”,而useMemo是将某个函数返回值“放入到react底层原型链上,并返回该返回值的索引”。一个是针对函数,一个是针对函数返回值。
- useImperativeHandle: useImperativeHandle可以让父组件获取并执行子组件内某些自定义函数(方法)。本质上其实是子组件将自己内部的函数(方法)通过useImperativeHandle添加到父组件中useRef定义的对象中。
- useMemo useMemo可以将某些函数的计算结果(返回值)挂载到react底层原型链上,并返回该函数返回值的索引。
当组件重新渲染时,如果useMemo依赖的数据变量未发生变化,那么直接使用原型链上保存的该函数计算结果,跳过本次无意义的重新计算,达到提高组件性能的目的。