You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用InertiaJS从控制器返回数据到Vue组件

问题原因

你的写法有三个核心错误:

  • 给Inertia::render传参格式错误:第二个参数要求是键值对格式的props数组,你传入的[ProductController::class, 'index']是路由绑定控制器方法的专用格式,不会自动执行控制器方法取数据。
  • 控制器返回逻辑错误:ProductController@index直接返回Eloquent集合的写法仅适用于API接口响应,Inertia请求需要把数据作为组件props传入渲染方法。
  • Vue组件props声明错误:props没有写在组件导出的配置对象内,且props名和后端传入的键名不匹配。
正确实现方案

1. 修正路由定义

路由直接指向控制器方法,不要在闭包中调用Inertia渲染:

// routes/web.php
use App\Http\Controllers\ProductController;
use Illuminate\Support\Facades\Route;

Route::get('/', [ProductController::class, 'index']);

2. 修正控制器逻辑

在控制器方法中查询数据,通过Inertia::render将数据绑定到Vue组件的props上:

// app/Http/Controllers/ProductController.php
namespace App\Http\Controllers;

use App\Models\Product;
use Inertia\Inertia;

class ProductController extends Controller
{
    public function index()
    {
        return Inertia::render('App', [
            // 键名products就是前端接收的props名,可自定义
            'products' => Product::all()
        ]);
    }
}

3. 修正Vue组件写法

根据你用的Vue API风格选对应的写法,保证props名和后端传入的键名完全一致:

选项式API写法

<template>
  <!-- 示例:遍历渲染产品列表 -->
  <div v-for="product in products" :key="product.id">
    {{ product.name }}
  </div>
</template>

<script>
export default {
  props: {
    // 和后端传入的键名保持一致
    products: Array,
  },
}
</script>

Vue3 <script setup>写法

<template>
  <div v-for="product in products" :key="product.id">
    {{ product.name }}
  </div>
</template>

<script setup>
defineProps({
  products: Array,
})
</script>
补充说明

如果你确实需要在路由闭包中直接渲染(不推荐,不利于代码分层),可以直接在闭包中查询数据传入:

Route::get('/', function () {
    return Inertia::render('App', [
        'products' => \App\Models\Product::all()
    ]);
});

内容的提问来源于stack exchange,提问作者Mishen Thakshana

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:24:45