Day22-生命周期

前言

这几天我们已经学习了Props外来传递资料,还有State组件本身状态。

今天要来学习很重要的一个使用观念 【生命周期】。

而为甚麽我们需要了解所谓的生命周期呢???

这是因为了解组件如何被挂载和被释放,可以使我们更能够运用这时间差来达到获取API或是额外的操作。

今日会学习到的Hooks

  • useEffect
  • useLayoutEffect

Class component

在React官方文档中有提供我们学习类组件的生命周期
Lifecycle
Lifecycle method

https://ithelp.ithome.com.tw/upload/images/20210919/20130419MGSjWRQ1HY.png

依照组件的挂载与销毁进度

constructor -> render(回传JSX)-> componentDidUpdate -> componentWillUnmount -> componentDidMount


useEffect

useEffect是React Hooks中针对生命周期的一个API

syntax

  useEffect(() => {
    // call
  }, [dependency])

若第二个参数为空,即每次只要有组件被更新就会执行

import React,{ useEffect , useState} from 'react'

function App() {
  const [count, setCount] = useState(0)
  useEffect(() => {
   console.log('changed'); 
  })
  return (
    <div></div>
  )
}

export default App

若第二个参数只有[ ] ,则只会执行一次

import React,{ useEffect , useState} from 'react'

function App() {
  const [count, setCount] = useState(0)
  useEffect(() => {
   console.log('changed'); 
  },[])
  return (
    <div></div>
  )
}

export default App

若第二参数我们有指定监控的对象,即该对象更新才会执行

import React,{ useEffect , useState} from 'react'

function App() {
  const [count, setCount] = useState(0)
  useEffect(() => {
   console.log('changed'); 
  },[count])
  return (
    <div>
      <button onClick={() => setCount(count + 1) }>Click</button>
      {count}
    </div>
  )
}

export default App


useLayoutEffect

syntax

  useLayoutEffect(() => {
   // call
  }, [dependency])

你说奇怪为什麽React要用两个这麽像的API???

以下的code 如果把button按快一点会造成页面的闪烁

import React,{ useEffect , useState, useLayoutEffect} from 'react'

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

  return (
    <div>
      <button onClick={() => setCount(0)}>Click</button>
      { count}    
    </div>
  )
}

export default App

如果改成使用useLayoutEffect,就会很顺畅并不会闪烁。

import React,{ useEffect , useState, useLayoutEffect} from 'react'

function App() {
  const [count, setCount] = useState(0)
  useLayoutEffect(() => {
   if(count === 0){
     setCount(1)
   }
  },[count])

  return (
    <div>
      <button onClick={() => setCount(0)}>Click</button>
      { count}    
    </div>
  )
}

export default App

为什麽会有以上两种差别呢???

原因在於当我们使用useEffect状态快速切换时会造成UI也会快速更新,进而变成画面跟不上我们点击的速度。

而如果是使用useLayoutEffect的话,相当於在UI更新前已经先执行好更新状态,所以状态提前被准备好。

总结

  • useEffect为非同步函式
  • useLayoutEffect为同步函式

我们看了官方的文档之後,解释为同步於DOM更新

https://ithelp.ithome.com.tw/upload/images/20210920/20130419fZWYDVSW1y.png

然而大部分的场景useEffect其实就可以完成我们的工作。


<<:  Day 12 CSS <圆角边框、盒子阴影>

>>:  v-show vs v-if

【Day 04】C 的一些基本语法

识别符号 用来标示函式、变数,或者使用者自定专案的名称,识别符号可用大写字母(A 到 Z)、小写字母...

Day11:终於要进去新手村了-Javascript-变数与运算子简单的综合运用

这里就记录一下前两篇变数与运算子综合运用的方式,做个简单练习。 下面就写一个简单的乘法计算,最近刚好...

Day 4 (CSS)

1.空格的意义: css选择器.s1 .s2{}=> 里面的"全部"都被我...

[Python 爬虫这样学,一定是大拇指拉!] DAY12 - HTTP / HTTPS (3)

了解 HTTP Message 的结构後,接下来要讲解的是 HTTP Method,这对爬虫来算是重...

Day 0x6 UVa10008 What's Cryptanalysis?

Virtual Judge ZeroJudge 题意 和上篇 Day 0x5 UVa10062 T...