Day13 Function Component的生命周期 - UseEffect

在Hook尚未出现之前,只有Class Component能够有生命周期可以使用。
什麽是生命周期?生命周期(lifecycle)是指Component从建立到销毁的过程。

React的生命周期分为三大阶段,并分别提供了对应函式使用:

  • Mounting(载入):建构Component并载入DOM渲染到画面。
    componentDidMount():Component加到DOM後呼叫。

  • Updating(更新):更新Component资料状态使其重新渲染。

    componentDidUpdate():Component更新後呼叫。

  • Unmounting(销毁):从DOM移除Component。

    componentWillUnmount():Component从DOM中移除时呼叫。

多亏了Hook的出现,我们在function Component中也能有类似生命周期的功能去执行动作啦!


UseEffect

可以把 useEffect 视为 componentDidMount,componentDidUpdate 和 componentWillUnmount 的组合,当元件开始建立进行生命周期,当元件资料有变动重新渲染元件时,便可在useEffect中对应执行动作。

来看看useEffect的使用方法吧

在component的js页面引入useEffect

import React, { useEffect} from 'react';

和useState一样,放置在在Function Component函式中的return之前

function App() {

	//使用useEffect()

  return //省略...
}

useEffect()函式所含的两个参数都是必填:

第一个参数:放入元件生命周期边动时要执行的function。

第二个参数:用来限制哪些资料参数在重新渲染时被改变,可以重新触发useEffect,只想在元件第一次渲染跟销毁时执行想要fuction的话,在第二个参数放空阵列[ ]就好。

useEffect(() => { 
//渲染前要进行的动作 
},[state]) //或是放空阵列[]

我们来实作看看:
https://ithelp.ithome.com.tw/upload/images/20210928/201403033HwR5VjUsu.png

我在父元件App里,希望input是空的时候,资料count要为0,

利用useEffect在count资料改变时判断input的值是不是为空。

import React, { useState,useEffect} from 'react';
import './App.css';
import Child from './Child';

function App() {
  const [count, setCount]= useState(0);
 
  useEffect(() => {
    if(count==='')setCount(0);
    },[count])

  return(
    <div className="App">
      <p>请输入数字</p>
      <input type="number" onChange={(event)=> setCount(event.target.value)} />
      <Child count={count}></Child>
    </div>
  );
}

export default App;

子元件Child靠props接收input的值,在Mounting和Updating做不同的动作

import React, { useState,useEffect} from 'react';
import './All.css';

function Child(props) {
  
  const [total,setTotal] =useState('请输入大於0的数字')
  
  useEffect(() => {
    console.log('建立');
    },[])

  useEffect(() => {
      console.log('总和变了')
      if(props.count === '0') setTotal('请输入大於0的数字');
      else setTotal(`总和为${50+parseInt(props.count)}`)
      },[props.count])
  

  return (
    <div>
       <p>50+{props.count}={50+parseInt(props.count)}</p>
       <p>{total}</p>
       
    </div>
    
)}

export default Child;

最後呈现的效果如下:

Mounting+Updating

https://ithelp.ithome.com.tw/upload/images/20210928/20140303T1F3j6H29L.png

Updating
https://ithelp.ithome.com.tw/upload/images/20210928/20140303HEeq17c03u.png


<<:  #28 JS: Timing Events - Part 2

>>:  防止使用者频繁送出 Request & 倒数计时重新发送认证码

卡夫卡的藏书阁【Book10】- Kafka Connect 1

“Books are a narcotic.” ― Franz Kafka 突然想起了恐龙书 Ka...

Windows Server 2019 如何安装 Mail Server,使用 hMailServer 来管理收发信

hMailServer 是一个免费、开源的 Windows 电子邮件服务器,可轻松管理收信及发信服务...

【Day 02】 何谓 Data Analytics Pipeline

随着数位时代的来临,企业内数据皆已指数级增长,而多数企业也加快数位转型脚步并推动『以数据驱动的决策模...

Day03-资料加工与逻辑整合(methods v.s. computed)

网页制作完成,在检查的时候却发现有错的表格内容,而同样的表格内容却在多个页面出现,要改就要重工五次,...

全端入门Day21_前端程序撰写之Vue.js

昨天介绍了JavaScript,今天就要来介绍JavaScript的框架:Vue 我不会介绍有关太多...