0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【小ネタ】Inertiaのrouter.getで送るデータがそこそこ複雑になったときどうする?

Posted at

はじめに

Inertiaで作ってるときに、「検索画面」を作ることがあると思うんですよ。
で、検索条件をサーバーに送るとき、特にデータを書き換えたりするわけではないので正気だったらGETで送ると思うんですよね。
1階層のフォームだったらそのまんま送ってなんとかなるんですけど、ちょっと複雑になるとクエリーパラメータの制約上おかしなデータが送られてきてしまいます。

要は

例: 複雑なデータ
const {data, setData, get} = useForm({
    hoge: [
        {
            huga: '',
            hugahuga: ''
        },
        {
            huga: '',
            hugahuga: ''
        }
    ]
})

const onSubmit = (e) => {
    e.preventDefault()
    get(route('moga'), data)
}

みたいにすると

?hoge[][huga]=&hoge[][hugahuga]=&hoge[][huga]=&hoge[][hugahuga]=

って感じなって、実際Laravel側で受け取ると

[
    'hoge' => [
        ['huga' => ''],
        ['hugahuga' => ''],
        ['huga' => ''],
        ['hugahuga' => ''],
    ]
]

という感じになってしまって、意図したものとちゃうなあ、ってことになります。

そうなっちまったときの対応策です。

結論

transformしてJSON.stringifyする。

const {data, setData, get, transform} = useForm({
    hoge: [
        {
            huga: '',
            hugahuga: ''
        },
        {
            huga: '',
            hugahuga: ''
        }
    ]
})

const onSubmit = (e) => {
    e.preventDefault()
    transform(data => {
      return {
        hoge: JSON.stringify(data)
      }
    })
    get(route('moga'))
}

useFormの中にtransformと言うメソッドがいるので、それを使います。

もちろん、Laravel側の受けの方でも decord_json する必要があります。
Requestクラスがもってる色々便利なメソッドは使えないですが、なんとかする方法はいくらでもあるので大丈夫だと思います。

$hoge = json_decode($request->input('hoge'));

/**
 * $hoge = [
 *     [
 *         'huga' => '',
 *         'hugahuga' => ''
 *     ],
 *     [
 *         'huga' => '',
 *         'hugahuga' => ''
 *     ],
 * ]
 * /
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?