React 常见 hooks 作用梳理

69 阅读6分钟

常见的钩子函数

    ☆ useState
        const [state, setState] = useState(initialState);
        state:目的是提供给 UI,作为渲染视图的数据源
        setState:改变 state 的函数,可以理解为this.setState
        initialState:初始默认值
    注意点:useState有点类似于PureComponent,会进行一个比较浅的比较,如果是对象的时候直接传入并不会更新,这点一定要切记

    ☆ useEffect
        副作用(function做了和本身运算返回值无关的事),可以理解为是函数组件的生命周期,也是我们最常用的钩子
        第二个参数是一个数组,如果不设置第二个参数,无论在什么情况下都会执行这个钩子函数,模仿挂载和卸载的动作,return后面的数据在组件卸载时会被调用
        如果传递一个空数组,就只会执行一次,也可以为他添加上依赖值

    ☆ useContext
        类似于Context:其本意就是设置全局共享数据,使所有组件可跨层级实现共享
        useContext的参数一般是由createContext的创建,通过 CountContext.Provider 包裹的组件,才能通过 useContext 获取对应的值
        const CountContext = createContext(-1) // 通过createContext创建初始值
        const count = useContext(CountContext) // 通过useContext 来包裹组件,最终获取到对应的值

    ☆ useMemo
        判断是否满足当前的限定条件来决定是否执行callback函数,而useMemo的第二个参数是一个数组,通过这个数组来判定是否更新回调函数,,函数式组件会从头更新到尾,只要一处改变,所有的模块都会进行刷新,这种情况显然是没有必要的。只要父组件的状态更新,无论有没有对自组件进行操作,子组件都会进行更新,useMemo就是为了防止这点而出现的
    return useMemo(() => list.map((item:number) => {  // 有两个参数,第一个是一个回调函数,第二个是依赖数组
        console.log(1)
        return Math.pow(item, 2)
      }), [])

    ☆ useCallback
        useCallback与useMemo极其类似,可以说是一模一样,唯一不同的是useMemo返回的是函数运行的结果,而useCallback返回的是函数
    注意:这个函数是父组件传递子组件的一个函数,防止做无关的刷新,其次,这个组件必须配合memo,否则不但不会提升性能,还有可能降低性能

    ☆ useReducer
        类似于redux功能的api

    ☆ useRef
        可以获取当前元素的所有属性,并且返回一个可变的ref对象,并且这个对象只有current属性,可设置initialValue
        可以用来获取元素的所有属性,也能用来存放值

    ☆ useImperativeHandle
        可以让你在使用 ref 时自定义暴露给父组件的实例值
        useImperativeHandle(ref, createHandle, [deps])
        ref:useRef所创建的ref
        createHandle:处理的函数,返回值作为暴露给父组件的 ref 对象。
        deps:依赖项,依赖项更改形成新的 ref 对象。
    返回给父组件使用
        useImperativeHandle(cRef, () => ({
             add
         }))

        const add = () => {
           setCount((v) => v + 1)
         }

    ☆ useLayoutEffect:开发过程中一般使用useEffect就足够了
        与useEffect基本一致,不同的地方时,useLayoutEffect是同步,useLayoutEffect在 DOM 更新之后,浏览器绘制之前,这样做的好处是可以更加方便的修改 DOM,获取 DOM 信息,这样浏览器只会绘制一次,所以useLayoutEffect在useEffect之前执行。如果是useEffect的话 ,useEffect 执行在浏览器绘制视图之后,如果在此时改变DOM,有可能会导致浏览器再次回流和重绘。除此之外useLayoutEffect的 callback 中代码执行会阻塞浏览器绘制

    ☆ useDebugValue
        可用于在 React 开发者工具中显示自定义 hook 的标签
    ☆ useTransition
        返回一个状态值表示过渡任务的等待状态,以及一个启动该过渡任务的函数。
        const [isPending, startTransition] = useTransition();
        isPending:过渡状态的标志,为true时是等待状态
        startTransition:可以将里面的任务变成过渡任务

        const Index = () => {

        const [isPending, startTransition] = useTransition();
        const [input, setInput] = useState('');
        const [list, setList] = useState([]);

        return  <div>
            <div>大家好:我是小杜杜~</div>
            输入框: <input
              value={input}
              onChange={(e) => {
                setInput(e.target.value);
                startTransition(() => {
                  const res = [];
                  for (let i = 0; i < 2000; i++) {
                    res.push(e.target.value);
                  }
                  setList(res);
                });
              }} />
            {isPending ? (
              <div>加载中...</div>
            ) : (
              list.map((item, index) => <div key={index}>{item}</div>)
            )}
          </div>
        }

export default Index


React 组件类 API

Component
        React中的组件,类组件需继承这个api
    ☆ PureComponent
        纯组件会对props和state做浅层比较,提升性能,不刷新的时候不刷新,他自带的属性就实现了shouldComponentUpdate 这个生命周期函数
    ☆ memo(高阶组件)
        类似于shouldComponentUpdate这个生命周期,有两个参数 第一个是组件本身,第二个是一个回调函数(返回是true则不刷新,返回为false则刷新),可以判断只组件是否可以刷
        (只判断props)
    ☆ forwardRef
        传递ref
    ☆ lazy
        懒加载组件(可以定义一个动态加载组件)减少bundle的体积  他的参数是一个函数  lazy(()=>import('./Child'))
        注意:这个组件必须和Suspense配合使用
    ☆ Suspense
        让组件等待某个异步组件操作,直到该异步操作结束即可渲染,在使用lazy加载组件的时候,一定要加上这个
        他和lazy都可以用于等待照片,脚本和一些异步的情况,他的fallback为等待时的渲染样式  <Suspense fallback={()=><div>Loading</div>}>
    ☆ Fragment
        碎片化,允许返回多个结点(类似<></>) <React.Fragment></React.Fragment>,相比<></> 这个可以给一个key值,在遍历数组的时候很有用
    ☆ Profiler
        这个组件用于性能检测,可以检测一次react组件渲染时的性能开销,不常用
    ☆ StrictMode
       严格模式,是一种用于突出显示应用程序中潜在问题的工具,与Fragment一样,StrictMode也不会出现在UI层面,只是会检查和警告

React 工具类 API

    ☆ createContext
        用于传递上下文,createContext会创建一个Context对象,用Provider的value来传递值,用Consumer接受value
        const {Provider,Consumer} = React.createContext(),里面可以设置默认值
    ☆ createElement
        element:原生组件的话是标签的字符串,如“div”,如果是React自定义组件,则会传入组件
        [props]:对象,dom类中的属性,组件中的props
        [...children]:其他的参数,会依此排序
          return React.createElement(
                'div',
                null,
                "Hi!我是小杜杜",
                React.createElement('p', null, '欢迎'), // 原生标签
                React.createElement(
                    Children, //自定义组件
                    null, // 属性
                    '我是子组件'  //child文本内容
                )
            )

    ☆ cloneElement
        克隆并返回一个新的React元素
    ☆ createRef
        创建一个ref对象,获取节点信息, node = React.createRef()
        不过我们可以直接通过ref来获取值,没有必要再通过createRef去获取 <div ref={(node)=>this.node=node}></div> node 为节点信息
    ☆ Children:提供处理this.props.children不透明数据结构的实用程序.
        map:两个参数
            可以将通过children传递过来后被包裹成数组类型的进行处理  React.Children.map(children,(item)=>item)
        forEach:
            与Children.map类似,不同的是Children.forEach并不会返回值,而是停留在遍历阶段  React.Children.forEach(children, (item) => console.log(item))
        count:
            返回Child内的总个数,等于回调传递给map或forEach将被调用的次数  React.Children.count(children)
        toArray:
            以平面数组的形式返回children不透明数据结构,每个子元素都分配有键。获取扁平化后的数据   React.Children.toArray(children)
        only:
            验证Child是否只有一个元素,如果是,则正常返回,如果不是,则会报错。 React.Children.only(children)
    ☆ isValidElement
        用于验证是否是React元素,是的话就返回true,否则返回false,感觉没什么用
     ☆ createFactory
        返回一个生成给定类型的 React 元素的函数。
        const Child = React.createFactory(()=><div>createFactory</div>)
        这个可以直接使用,但是官方不建议我们写这个,不常用,应该快废弃了