state から作れる値は state に保存せずレンダリング時に毎回作るわけですが 重くなる処理は毎回作り直したくないので useMemo を使って毎回計算しないようにします
ただ その state を複数のコンポーネントに渡してそれらのコンポーネントでも同じ計算結果を使いたいことがあります
state とそれから作った値をまとめて props で渡すこともできますが 渡す値を増やしたくはないです
state があれば作れるのですから 本来渡すべきデータは state だけのはずです

でもそうすると state とそれから作る値を使う全部のコンポーネントで個別に useMemo で再計算なんですよね
なのでグローバルな useMemo が欲しいというわけです

グローバルならフックに頼れなくなりますが モジュール内に共通の保存する場所を作れば済みます
同じ state を指定したら同じ値になるとすると 同じ state から別の計算によって値を作るケースに対応できないので それを見分けるキーが必要になります
同じ state とキーならどのコンポーネントからでも同じ結果を返します
同じ計算なら関数も同じになるはずなので 関数をキーにします

const data = []
const isSame = (a, b) =>
a.length === b.length &&
a.every((v, i) => v === b[i])
const globalMemo = (fn, deps) => {
const key = [fn, ...deps]
const item = data.find(x => isSame(x.key, key))
if (item) return item.value
const value = fn(...deps)
data.push({ key, value })
return value
}

これでいい感じに動きはするのですが data に古いデータがずっと残ってしまいます
保存を直近◯件に制限したり 保存したのが古くてもよく使うのは残すようにソートするなど工夫が必要そうです