React管理下にない値の変更時に描画を更新したい。
あまり使いたいものでもないですが、React.Component
では適切なタイミングでthis.forceUpdate()
を使うことになります。
今回は関数コンポーネントで作成中にforceUpdate
に当たる処理が必要になったのでどうにかしようという内容です。
Function Component
での forceUpdate
これを簡単に言い換えるとHook
が欲しい。
しかし、そのものはないようなので他Hook
を使って同様の結果になるようにします。
forceUpdate
を使うためのuseForceUpdate
を考えます。
1 2 3 4 |
const useForceUpdate = () => { const [value, setValue] = React.useState(0); return () => setValue(value => ++value); } |
再描画するためだけのState
を更新する関数を作り、呼び出して更新させます。
ただ1回呼び出すためにこれを書くのも少し変な気がする。
State
の更新をコールバック化して呼び出す。
1 2 |
const [, setState] = React.useState(); const forceUpdate = React.useCallback(() => setState({}), []); |
これならコンポーネント内にちょっと書くだけで使えます。
より簡略化するならuseReducer
を使ってdispatch
として定義すればいいです。
1 |
const [, forceUpdate] = React.useReducer(x => ++x, 0); |
これは公式の「forceUpdate のようなものはありますか?」にあるやつをさらに簡潔にしたものです。
今回はしかたなく使っていますが、煩雑になりがちなのでできるだけ使わなくて済むやり方を見つけたいですね。