React结合Hooks之useEffect、useRef、useCallback和useMemo

前言:我们大部分 React 类组件可以保存状态,而函数组件不能? 并且类组件具有生命周期,而函数组件却不能?React 16.8 新出来的Hook可以让React 函数组件具有状态,并提供类似 componentDidMount和componentDidUpdate等生命周期方法。
  • React Hooks 的意思是: 组件尽量写成纯函数,如果需要外部功能和副作用,就用钩子把外部代码"钩"进来。

useEffect

作用 (因函数组件中没有生命周期,故可以实现刚创建组件时的一个生命周期)
  • 可以看作是react的componentDidMount,componentDidUpdate 和 componentWillUnmount 这三个函数的组合。
用法
import React, {useRef, useEffect, useState} from "react";

function Ref (){
    const [count, setCount] = useState<number>(0)
    useEffect(() => {
      setInterval(() => {
        setCount(c => c + 1)
     }, 1000)
    }, 第二个参数)

    接收两个参数,
    第一个参数为函数,
    第二个参数:
          1. 不传,组件里面每一个状态(count)发生改变,就会执行
          2. 传[],组件创建时执行,只执行一次,状态发生改变不会执行
          3. 传[count, count],里面状态发生就会去执行

    return (
        <>
            <div>计数:{count}</div>
        </>
    )
}
export default Ref;
  • useEffect还可以实现销毁,实现例如vue的destroyed周期,这里使用useEffect回调函数的return,组件被销毁时才会执行
 useEffect(() => {
      setInterval(() => {
        setCount(c => c + 1)
     }, 1000)
     return () = {
        这里可以在组件销毁时用来销毁setInterval定时器
     }
 }, 第二个参数)

useRef

作用(缓存值,比如缓存读取取消定时器前的值)
  • 用来获取DOM元素对象保存数据(使用属性current取值)
用法
import React, {useRef, useEffect, useState} from "react";

function Ref (){
    let timer = useRef<any>();
    const [count, setCount] = useState<number>(0)

    const start = () => {
      if (!timer) {
          timer.current = setInterval(() => {
            setCount(c => c + 1)
        }, 1000)
      }
    }

    const stop = () => {
       if (timer.current) {
          clearInterval(timerId.current);
          timer.current = null
       }
    }
    return (
        <div>
            <div>计数:{count}</div>
            <button onClick={start}>启动</button>
            <button onClick={stop}>停止</button>
        </div>
    )
}
export default Ref;
  • useRef不会因为组件的更新而丢失数据,虽然组件进行了更新,但是通过useRef保存的数据是不会丢失的,这里通过useRef中的current来进行保存(官方要求的写法)

useCallback

作用(缓存回调函数)
  • 因为本地变量每次变化,函数会每次创建,故造成性能浪费,所以使用react的hook里面的useCallback可缓存函数
用法
const start = useCallback(() => {
      if (!timer) {
          timer.current = setInterval(() => {
            setCount(c => c + 1)
        }, 1000)
      }
}, [])

两个参数(回调函数,参数列表),第二个参数用法同useEffect

useMemo (使用范围比useCallback更广)

作用(缓存回调函数的return值,可以是对象,函数,简单值)
  • useCallback是useMemo改造版
用法
const start = useMemo(() => {
      return () => {
         if (!timer) {
            timer.current = setInterval(() => {
              setCount(c => c + 1)
          }, 1000)
        }
     }
}, [])
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容