- Published on
React useMemoの使い所と役割
ReactのuseMemoがどういう役割を持っていて、いつどのような状況の時に使うべきかを紹介します。 また、useCallbackとよく違いを知るためにuseCallbackの使い所と役割はこちらも参考にしてみてください。
それでは、useMemoの役割を紹介します。 useMemoはその名の通りmemo化をするもので、関数の結果をメモ化する時に使います。
重たい処理がありその結果を都度計算したくなく、ある状態が変化した時だけ再計算してつかいた時に使うものです。下記を見てもらえれば、useMemoがどのようなものかわかるかと思います。
useMemo button
を押すと、console.log('get favorite function is called', count)
が実行されないことがわかるかと思います。これは、useMemoが関数の実行の結果(今回だとreturn "りんご"
)を保存して、それを返すものになっているからです。また、useCallback
はgetFavoritFoodCallback("りんご")
のように呼び出すのに対して、useMemoは関数が実行された結果を保持するのでgetFavoritFood
を呼びすだけになります。
またcountが更新されると、useCallback
は実行されないのに対して、useMemo
でラップしている関数は都度実行されるので、countが更新されるたびに、 console.log('get favorite function is called', count)
が実行され、コンソールに値が出るのでそれも見てみると、useMemo
がよりわかるかと思います。
import React, { useCallback, useMemo, useState } from "react"; const App = () => { const [count, setCount] = useState(0) const getFavoritFoodCallback = useCallback((food) => { return food }, []) const getFavoritFood = useMemo(() => { console.log('get favorite function is called', count) return "りんご" },[count]) console.log("App is called") return ( <> <p>{count}</p> <button onClick={() => setCount(count + 1)}>++</button> <button onClick={() => getFavoritFood}>useMemo button</button> <button onClick={() => getFavoritFoodCallback('りんご')}>useCallback button</button> </> ); } export default App;
useMemoはuseCallbackと同等のことを下記のようにするとできますが、本来の役割は大きく異なることがわかったと思います。ちなみに、この場合は、() => fnの結果を保存する、つまり関数の参照を保存するので、useCallbackと同じ機能を持つこともできますが、本来は関数の結果を保存するものなので、その違いもわかったかと思います。
useCallback(fn, deps) is equivalent to useMemo(() => fn, deps).