Rotas
A URL continua sendo uma rota PHP. O nome dessa rota chega no Vue por route(), sem import.
<Link :href="route('user.panel')">. O texto entre aspas é o nome registrado no PHP, não o caminho.
O nome no PHP
O contrato é o de Rotas. O handler devolve inertia('Home'). Home é o arquivo pages/Home.vue.
uri::get('/inertia', [inertia_handler::class, 'index'])->name('inertia.welcome');
uri::post('/inertia/ping', [inertia_handler::class, 'ping'])->name('inertia.ping');A Engine publica route() antes da página. No template e no <script setup> a chamada é direta. Parâmetro preenche o placeholder. O que sobrar vira query string.
route('profile.show', { type: 'char', name: 'Ana' })O mapa não vai nas props. Ele fica em storage/framework/cache/inertia/routes-{hash}.js e o HTML pede esse arquivo uma vez. Criar ou mudar uma rota troca o hash no próximo carregamento completo, sem npm run build.
Link
<script setup>
import { Link } from '@inertiajs/vue3'
</script>
<template>
<Link :href="route('user.panel')">Meu Painel</Link>
</template>Link vem de @inertiajs/vue3. A visita segue em SPA: a barra muda e o PHP não redesenha o layout .mucrm.php.
Formulário
<script setup>
import { useForm, usePage } from '@inertiajs/vue3'
const page = usePage()
const form = useForm({
name: typeof page.props.old?.name === 'string' ? page.props.old.name : '',
})
function submit() {
form.post(route('inertia.ping'))
}
</script>
<template>
<form @submit.prevent="submit">
<input v-model="form.name" />
<button :disabled="form.processing">Enviar</button>
<p v-if="form.errors.name">{{ form.errors.name }}</p>
<p v-if="page.props.flash?.message">{{ page.props.flash.message }}</p>
</form>
</template>useForm também vem de @inertiajs/vue3. O campo fica em form.name.form.post, form.put e form.delete usam a URL devolvida por route(). O método HTTP é o do form, não um argumento de route().