React Hooks - useEffect

  • useEffect() 让我们在 function component 内也可以实现 class function 中的生命周期componentDidMount()componentDidUpdate()componentWillUnmount()
  • 专门处理 side effect,包括 Dom 操作、数据请求、萤幕刷新、计时器、设定 subscription ...等。
  • 让 component 在 render 後做一些事情,React 会记住我们在 useEffect() 里传递的 function,并在 render 後呼叫它。
  • 在任何情况下,只要第一次 render 都会触发 useEffect()。

用法:

useEffect(() => {
    // effect 

    return () => {
        // Cleanup function
    }
}, [// Updating])

第一个参数为 function,告诉 React 渲染完毕要执行什麽内容,而 useEffect 回传的是一个清除的函式(类似 class component 的 componentWillUnmount()),在 component 将要被卸载时触发,若不需要清除,就可以将回传值省略为空。

需要清除的函式通常为:取消订阅、取消网路请求、取消计时器等。

第二个参数是更新状态的地方,如果不需更新,第二个参数可省略。

  • 如果第二个参数是一个 dependacy array,此时 useEffect() 会在渲染的第一次执行之外,也会在第二个参数的值被改变时执行(类似 class component 的 componentDidUpdate())。
useEffect(() => {
    // 要做的事
},[dependacy array])
  • 如果没有第二个参数,代表监测所有的东西,只要 state 或 props 有发生任何改变就会触发 useEffect(),state 或 props 的值被更新几次就执行几次
useEffect(() => {
    // 要做的事
})
  • 如果第二个参数是空阵列,代表谁也不监测,只会在 component 渲染的第一次执行(类似 class component 的 componentDidMount()
useEffect(() => {
    // 要做的事
},[])
  • 只要重新渲染,就会执行所有 useEffect

例如:

import React,{ useState, useEffect } from 'react'
const HookUseEffect = () => {
    const [count, setCount] = useState(0);
    const [test, setTest] = useState("test");
    
    // 1. 没有第二个参数,每次都执行
    useEffect(()=>{
        console.log('我每次都会执行');
    })
    
    // 2. 第二个参数是空阵列,只会执行第一次
    useEffect(()=>{
        console.log('我只会执行第一次');
    },[])
    
    // 3. 第二个参数不是空阵列,这个参数的状态有被改变时就会执行
    useEffect(() => {
        console.log('test 被改变我就执行');
    }, [test])
    
    return (
        <div>
            <h3>Hook UseEffect</h3>
            <p>{count}</p>
            <button onClick={() => { setCount(count + 1) }}>Click</button>
            <br />
            <p>{test}</p>
            <button onClick={() => { setTest(test.toUpperCase())} }>Test</button>
        </div>
    )
}
export default HookUseEffect

执行上面的程序码後,可以看到在网页一被打开时,console 就会显示三个讯息,是因为在第一次渲染时会执行所有的 useEffect。
https://ithelp.ithome.com.tw/upload/images/20211006/201402825Gf9hp8Sor.jpg
点击 click 时,因为 count 被改变,在 console 可以看到每次点击 click 时都会触发第一个 useEffect() 执行,下图是点击 click 2 下的结果,useEffect() 被执行两次。
https://ithelp.ithome.com.tw/upload/images/20211006/20140282ggxzUhpSKp.jpg
接着点击 test ,在 console 可以看到第三个 useEffect() 被执行,第三个 useEffect 会因为 test 的状态被改变就执行。
但这时也可以看到第一个 useEffect() 被执行了,是因为第一个 useEffect() 没有第二个参数,所以只要在 component 中有任何一个状态被改变都会执行。
https://ithelp.ithome.com.tw/upload/images/20211006/20140282fYMo2VlH3n.jpg


<<:  Day22 NiFi - 与 GCP PubSub 对接设定

>>:  DAY22:Service背景服务之简介

[D10] 影像杂讯与滤波(1)

在电子学里讲的杂讯,是在讯号传递的过程中会受到一些外在能量影响所产生讯号的干扰,这些由外在能量产生的...

[Day30] 持续整合与部署 - 我与 ASP.NET Core 3 的 30天

在现代化的网站开发中,逐渐也趋向将交付的功能切小,并频繁交付,使开发出来的功能可以小部分小部分快速确...

蓝底白字错误讯息

最近Windows Updata有列印问题KB5000802, 而我是用Chrome进1111人力银...

30天学会C语言: Day 19-考试常用的输入格式

多行输入 or 单行多个数值 如果输入的行数或一行中输入的数值数量固定且非常多,可以用回圈达成 #i...

2020it邦铁人赛-30天手把手的Vue.js教学 Day28 - 关心时事! 做个简单的COVID-19追踪app吧!(上)

tags: Vue.js ItIron2020 前言 终於进到最终的三天了,坦白说做为一个教学的系列...