react19のuseTransition触ってみる
## react18のuseTransitionとの変更点
const [isPending, startTransition] = useTransition()
- startTransitionに渡す関数が同期処理から非同期処理に変更。
### useTransitionを使わない場合のfetch(useStateで切り替える場合)
export const Prefectures = () => { const [postedData, setPostedData] = useState('') const [isPending, setIsPending] = useState(false) const onClick = async () => { setIsPending(true) const apiKey = 'uaz4eakpx2hfYN2P9Mvrp62GPOWuwOeUEWw21sao' const response = await fetch( 'https://opendata.resas-portal.go.jp/api/v1/prefectures', { headers: { 'Content-Type': 'application/json', Accept: 'application/json', 'X-API-KEY': `${apiKey}`, }, } ) setIsPending(false) const jsonResponse = await response.json() setPostedData(JSON.stringify(jsonResponse)) } return ( <div> <strong>Like: {String(isPending)}</strong> <button onClick={onClick} disabled={isPending}> 送信 </button> <p>APIからのデータ{isPending ? 'Loading...' : postedData}</p> </div> ) }
setIsPending(true)でisLoadingを管理
### useTransitionを使った場合のfetch
export const Prefectures = () => { const [isPending, startTransition] = useTransition() const [postedData, setPostedData] = useState('') function sleep(ms: number) { const startTime = performance.now() while (performance.now() - startTime < ms); } const onClick = async () => { setPostedData('') startTransition(async () => { const apiKey = 'uaz4eakpx2hfYN2P9Mvrp62GPOWuwOeUEWw21sao' const response = await fetch( 'https://opendata.resas-portal.go.jp/api/v1/prefectures', { headers: { 'Content-Type': 'application/json', Accept: 'application/json', 'X-API-KEY': `${apiKey}`, }, } ) sleep(3000) const jsonResponse = await response.json() setPostedData(JSON.stringify(jsonResponse)) }) } return ( <div> <strong>Like: {String(isPending)}</strong> <button onClick={onClick} disabled={isPending}> 送信 </button> <p>APIからのデータ{isPending ? 'Loading...' : postedData}</p> </div> ) }
メモ
fetchに関してはreact-queryで良いと思いましたが、実際useStateでの切り替えを行ってるコードもあった為、比較として書いてみました。