React Hooks之useEffect

52 阅读2分钟

React引入Hooks的原因:

  • 在不改变组件层次结构的情况下重用状态逻辑:使用Hooks,我们可以从组件中中提取状态逻辑,以便在需要时独立测试和重用。这使得在许多组件之间或与团队中的其他人共享Hooks变得很容易。
  • 将一个组件拆分为更小的函数:Hooks还使编写生命周期方法比以往任何时候都更容易。它的每一个生命周期方法通常都包含一组不相关的逻辑。

useEffect

  • 接受用于执行任何副作用的函数;
  • 使用方式:useEffect(effectFunction,arrayDependencies)
  • 传递给useEffect的函数将在渲染提交到屏幕后运行。这些效果在渲染完成后运行,但我们也可以根据某些值的变化来激发他们。
  • 一般是在useEffect当做mount函数,用来获取后端的数据:
     useEffect(()=>{
     Axios.get(''my-api/user/username)
    .then(response=>{
        //do Something......
    })
    },[])
    //换种写法就是
    useEffect(()=>{
      const getData = async ()=>{
        const res = await queryData()
        //do Something......
    }
    getData()
    },[])
  • UseEffect可以替代生命周期函数:ComponentDidMount,ComponentDidUpdate,componentWillUnmount
  • useEffect具有清理作用,我们必须在一段时间后清除效果,这通常是通过从传递给useEffect的效果函数中返回一个函数来完成的
useEffect(()=>{
const subscription = props.source.subscribe();
return ()=>{
    subscription.unsubscribe()
}
})
  • 创建多个效果:要添加多个效果,我们可以在一个函数组件中有多个useEfect调用;
useEffect(()=>{
    const clicked = ()=>console.log('window clicked')
    window.addEventListener('click',clicked)
    
    return ()=>{
        window.removeEventListener('click',clicked)
    }
},[])

  • 跳过效果的多种方法:可以跳过useEffect的调用,而不是在每次渲染的时候调用它。这可以使用多种方式实现:
    • 使用数组依赖;在依赖数组变化的时候,效果函数将被调用
    • 使用空数组依赖。只有在挂载时才调用effect函数;
    • 不使用数组依赖。效果函数将在每次渲染后运行:

useEffect与useMount

  • useEffect空数组依赖的弊端
    • 严格模式下,不是只执行一次,而是两次
    • 执行两次的情况,比如在获取auth认证,令牌或者token时,短时间内服务端不支持给两个不同的请求都发放认证,而是两个都报错
    • 空数组依赖的useEffect内,定时器或者处理监听回调的事件代码会获取不到最新的值。
  • useMount(挂载之后):与componentDidMount用法相同;无参回调函数;一般使用场景有
    • 添加事件监听、订阅事件
    • 添加定时器
    • 发送请求、初始化组件数据
    • 获取元素的尺寸和位置