这一次,彻底搞懂useEffect

简介: 让函数型组件拥有处理副作用的能力,类似生命周期函数。

什么是useEffect?

让函数型组件拥有处理副作用的能力,类似生命周期函数。

1. useEffect执行时机

可以把useEffect看做componentDidMount,componentDidUpdate,componentWillUnmount这三个函数的组合。

image.png

  • 当做componentDidMount和componentDidUpdate的时候
function App() {
    const [count,setCount] = useState(0);
    // 组件挂载完成之后 或 组件数据更新完成之后 执行
    useEffect(() => {
        console.log('组件挂载完成之后 或 组件数据更新完成之后 执行');
    })
    return (
        <div>
            {count}
            <button onClick={() => setCount(count + 1)}>+1</button>
        </div>
    )
}
  • 仅当做comonentDidMount的时候
useEffect(() => {
    console.log('仅当做componentDidMount');
},[])
  • 当做componentWillunmount的时候(注意:这里不是仅当做componentWillunmount)
useEffect(() => () => {
    console.log('当做componentWillUnmount');
})

2. useEffect的使用方法示例

  1. 为window对象添加滚动事件。(挂载完成后绑定事件,卸载组件后解除绑定)
function App() {
    function onScroll() {
        console.log('监听到页面发生滚动了');
    }
    useEffect(() => {
        window.addEventListener('scroll',onScroll);
        return () => {
            // 卸载组件时解除对事件的绑定
            window.removeEventListener('scroll',onScroll);
        }
    })
    return (
        <div>
            App 
        </div>
    )
}
  1. 设置定时器让count数值每隔一秒增加1。
function App() {
    
    const [count,setCount] = useState(0);
    useEffect(() => {
        const timeId = setInterval(() => {
           setCount(count => count + 1); 
        },1000)
        return () => {
            clearInterval(timeId);
        }
    },[])
    return (
        <div>
            <h1>当前求和为:{count}</h1> 
        </div>
    )
}

3. useEffect解决的问题

  1. 将一组相干的业务逻辑归置到了同一个副作用函数中.
  2. 简化重复代码,使组件内部代码更加清晰.

4:useEffect的第二个参数

  • 只有指定数据发生变化的时候才触发effect
useEffect(() => {
    document.title = count;
}, [count]) 

5:useEffect结合异步函数

在useEffect中直接使用async和await是会报错的,推荐使用立即执行函数来包裹异步函数。
function getData() {
    return new Promise(resolve => {
        resolve({msg: 'Hello'})
    })
}
function App() {

    useEffect(() => {
        (async function () {
            const result = await getData();
            console.log(result);
        })()
    },[])
    
    return (
        <div>
            App
        </div>
    )
}

参考文献

相关文章
|
前端开发 JavaScript 安全
useEffect 与 useLayoutEffect区别
useEffect 与 useLayoutEffect区别
81 0
|
6月前
|
存储 缓存 前端开发
我知道你想用useEffect,但你先别急
useEffect是React提供给我们的一个“逃生舱”,是React 的纯函数式世界通往命令式世界的“逃生通道”,选择合适的时机使用useEffect会让我们的代码既优雅又高效,反之会造成不必要的负担。
|
6月前
|
存储 JSON 前端开发
【第40期】一文彻底搞懂React网络请求
【第40期】一文彻底搞懂React网络请求
171 0
|
缓存 前端开发
💡我居然用错了useMemo和useCallback这么久?
💡我居然用错了useMemo和useCallback这么久?
|
存储 前端开发 JavaScript
🤮是时候放弃useState了,🚀这么写React更丝滑🚀
🤮是时候放弃useState了,🚀这么写React更丝滑🚀
|
存储 前端开发 JavaScript
面试官:useEffect和useLayoutEffect有什么区别?
源码角度剖析useEffect和useLayoutEffect区别
158 0
面试官:useEffect和useLayoutEffect有什么区别?
|
前端开发
react 使用 useEffect 及踩坑
react 使用 useEffect 及踩坑全记录
153 1
|
JavaScript 前端开发
面试官:Vue中的$nextTick有什么作用?
面试官:Vue中的$nextTick有什么作用?
224 44
|
JSON 前端开发 JavaScript
我明白了,react心得
React 就干两件事,打造用户界面,响应各种事件。16.0版本提出fiber,16.8版本提出hooks。 React原来是php项目,后来改了编译器,换成js来编译,然后加入虚拟dom。所以React只做两件事,一件事是渲染ui,一件事是响应事件。mvc和mvvm都是早些年angular的设计理念。react并不是什么mvvm和mvc,它只是一个很小的东西,只做那两件事儿。它只是个工具。backbone才是真正的mvc,它是模仿java的spring,挪到前端来了。
188 0
我明白了,react心得
|
存储 前端开发
React中的闭包陷阱以及如何使用useState姿势(I)
React中的闭包陷阱以及如何使用useState姿势
1334 0
React中的闭包陷阱以及如何使用useState姿势(I)