見出し画像

useActionStateに、それよりも後に書いた関数を渡す方法

useActionStateの関数の位置

Reactバージョン19(2024年12月安定版リリース)で導入されたuseActionStateに渡す関数は、次のようにfunctionを使った記法にすると、useActionStateよりも後(下部)に書くことができます。

import { useActionState } from "react"

const App = () => {
    const[state, getDataAction, isPending] = useActionState(getData, "")

    async function getData(prevState, formData){
        
        ...
        
    }

    return (
        <form action={getDataAction}>
            
            ...

        </form>
    )
}

export default App

functionを使った記法(=関数宣言)には巻き上げがあるため、それよりも前に利用可能なのです。

以下、もう少し具体的に見ていきましょう。

useStateをuseActionStateで置き換える

次のようなベーシックなReactのコードを考えてみます。

「phone」や「car」といったデータを送ってダミーのJSONデータを取得するコードです。

import { useState } from "react"

const App = () => {
    const [data, setData] = useState("")
    const [result, setResult] = useState("")

    const getData = async(e) => {
        e.preventDefault()
        const response = await fetch(`https://dummyjson.com/products/search?q=${data}`)
        const jsonData = await response.json()
        setResult(jsonData)
    }

    return (
        <form onSubmit={getData}>
            <input type="text" onChange={(e) => setData(e.target.value)}/>
            <button>送信</button>
        </form>
    )
}

export default App

useActionStateを使うと、次のように書き換えられます。

import { useActionState } from "react"

const App = () => {
    const getData = async(prevState, formData) => {
        const data = formData.get("random")
        const response = await fetch(`https://dummyjson.com/products/search?q=${data}`)
        const jsonData = await response.json()
        return jsonData
    }

    const[state, getDataAction, isPending] = useActionState(getData, "")

    return (
        <form action={getDataAction}>
            <input type="text" name="random"/>
            <button>送信</button>
        </form>
    )
}

export default App

関数の記法を「const」から「function」に変える

useActionStateはgetDataの下部に書かれています。

「const...」を使った記法では、それよりも前に利用ができないからです。

しかしuseActionStateでuseStateを置き換えた経緯を考えると、useStateと同じ位置にuseActionStateを書きたいとも感じます。

その時は次のように、「const...」で始まる記法を「function」を使った記法に書き換えましょう。

// 変更前
const getData = async(prevState, formData) => {...

// 変更後
async function getData(prevState, formData){...

すると、useActionStateを次のように上部に書けます。

import { useActionState } from "react"

const App = () => {
    const[state, getDataAction, isPending] = useActionState(getData, "")

    async function getData(prevState, formData){
        const data = formData.get("random")
        const response = await fetch(`https://dummyjson.com/products/search?q=${data}`)
        const jsonData = await response.json()
        return jsonData
    }

    return (
        <form action={getDataAction}>
            <input type="text" name="random"/>
            <button>送信</button>
        </form>
    )
}

export default App

「const...」で始まる記法(=関数式)では、それよりも前に関数を利用できません(巻き上げがないため)。

一方で「function」を使った記法(=関数宣言)ではそれが可能なため、getDataよりも前にuseActionStateを書けます。

この記事の著者については下記リンクをチェック

◆ Amazon著者ページ:https://www.amazon.co.jp/stores/author/B099Z51QF2

公式サイト:https://monotein.com

X(Twitter):https://twitter.com/monotein_

React、Next.js、TypeScriptなどのお役立ち情報や実践的コンテンツを、ビギナー向けにかみ砕いて無料配信中。メルマガ登録はこちらから → https://monotein.com/register-newsletter

いいなと思ったら応援しよう!