🎣

useEffectが行ってくれる処理まとめ

2021/03/03に公開

最近React Hooksを勉強し始めましたが、引数の渡し方によって処理が変わるuseEffectがややこしく感じたので、まとめてアウトプットします。

useEffectが行ってくれる処理

ClassComponentを使わなくても、FunctionComponentで下記処理を行える

1. componentDidUpdate
2. componentDidMount
3. componentWillUnmount

componentDidUpdate

画面がre-renderされたときに実行する

useEffect(function())

re-renderが起こる状況

1. 画面の更新
2. setStateなどの使用により、stateが変化したとき

componentDidMount

DOMがマウントされたときのみ実行する
(画面のre-renderではない)

useEffect(function(), [])

componentWillUnmount

DOMがアンマウントされたときのみ実行する

useEffect(function() { return function() }, [])

useEffectに渡した関数の中で関数をreturnする(cleanup functionをreturnする)
=> cleanup functionの中の処理がunmount時に実行される


その他

componentDidMount + componentDidUpdate

DOMがマウントされたとき & 画面がre-renderされたときに実行する

つまり

DOMがマウントされたとき & あるstateがsetStateで変更されたときに実行する

// stateNameは、変更検知したいstateの名前
useEffect(function(), ['stateName'])


ex) マウント時と、state.addressが更新されたときは実行したいという場合

// state内にオブジェクトが複数あるとする
const [name, setName] = useState('Ted')
const [address, setAddress] = useState('Indiana')

// DOMマウント時に実行 & addressが変更されたときは必ず実行
useEffect(funtion(), ['address'])

[]には監視したいstateを入れるイメージ

async-awaitを使うとき

useEffectでは必ず関数を返す必要があるので、
useEffectに直接async関数は書けない

// これはダメ
useEffect(async () => {}, [])

// これはOK
useEffect(() => {
  const func = async () => {}
  
  func()
}, [])


まとめ

// componentDidUpdate
useEffect(function())

// componentDidMount
useEffect(function(), [])

// componentWillUnmount
useEffect(function() { return function() }, [])

// componentDidUpdate + componentDidMount
useEffect(function(), ['propertyNameForRecalling'])

Discussion