将 Laravel 集合中的 id 参数传递给 Vue 组件

Posted

技术标签:

【中文标题】将 Laravel 集合中的 id 参数传递给 Vue 组件【英文标题】:Passing id parameter from Laravel Collection to Vue Component 【发布时间】:2020-12-24 01:04:24 【问题描述】:

在我的 Blade.php 文件中,我目前有一个变量 $item,当转储时等于:

Illuminate\Database\Eloquent\Collection #2313 ▼
  #items: array:48 [▶]

然后在我的 Blade.php 文件中,我调用了一个 Vue 组件并尝试绑定并传递一个路由(路由应该通过它在 Vue 中的 id 动态呈现一个项目),它看起来像:

 <my-items
   :route=" json_encode(route('items.show', ['id' => $item->id])) "
  ></my-items>

但是当我重新加载我的页面时,我收到了这个错误:

Property [id] does not exist on this collection instance.

$items 转储

Illuminate\Database\Eloquent\Collection #2371 ▼
#items: array:48 [▼
0 => App\Items #2351 ▶
1 => App\Items #2350 ▶
2 => App\Items #2349 ▶
3 => App\Items #2348 ▶
4 => App\Items #2347 ▶
5 => App\Items #2346 ▶
6 => App\Items #2345 ▶
7 => App\Items #2344 ▶
8 => App\Items #2343 ▶
9 => App\Items #2342 ▶
10 => App\Items #2341 ▶
11 => App\Items #2340 ▶
12 => App\Items #2339 ▶
13 => App\Items #2338 ▶
14 => App\Items #2337 ▶
15 => App\Items #2336 ▶
16 => App\Items #2335 ▶
17 => App\Items #2334 ▶
18 => App\Items #2333 ▶
19 => App\Items #2332 ▶
20 => App\Items #2331 ▶
21 => App\Items #2330 ▶
22 => App\Items #2329 ▶
23 => App\Items #2328 ▶
24 => App\Items #2327 ▶
25 => App\Items #2326 ▶
26 => App\Items #2325 ▶
27 => App\Items #2324 ▶
28 => App\Items #2323 ▶
29 => App\Items #2322 ▶
30 => App\Items #2321 ▶
31 => App\Items #2320 ▶
32 => App\Items #2319 ▶
33 => App\Items #2318 ▶
34 => App\Items #2317 ▶
35 => App\Items #2316 ▶
36 => App\Items #2315 ▶
37 => App\Items #2314 ▶
38 => App\Items #2313 ▶
39 => App\Items #2312 ▶
40 => App\Items #2311 ▶
41 => App\Items #2310 ▶
42 => App\Items #2309 ▶
43 => App\Items #2308 ▶
44 => App\Items #2307 ▶
45 => App\Items #2306 ▶
46 => App\Items #2305 ▶
47 => App\Items #2304 ▶
]

如何将所有项目的 id 传递给我的 vue 组件,以便它们可以使用 vue 动态呈现?

谢谢。

【问题讨论】:

【参考方案1】:

我认为这是一个数组。所以你必须使用foreach$item[index]-&gt;id

【讨论】:

我需要在刀片文件中遍历它们,然后将其传递给我的 vue 组件:route ? 你能分享一个完整的转储图像吗?这将有助于提供解决方案。我认为是的,您需要使用循环。 你使用循环吗?尝试 @foreach($item as $singleItem) 然后在这个循环中使用 $singleItem->id 我想保留 Vue 中的所有循环逻辑,而不是刀片。 那么你必须通过vue资源在组件文件中获取这些数据,或者你可以使用axios【参考方案2】:

在你的刀片文件中试试这个:

@foreach ($item as $items)
    <ItemComponent
        v-bind:item=" json_encode($item) "
    />
@endforeach

这会将完整的 item 对象传递给每个 ItemComponent,如果您只想传递 id,则可以改用 :itemId=" json_encode($item-&gt;id) "

如果您想在 Vue 中保留循环逻辑,请参考我之前使用 http 请求而不是内联模板的答案:

相反,您的 laravel 后端端点应该在从您的 Vue 包装器组件调用后使用响应正文中的 ID 数组进行响应。然后你可以在 Vue 中使用 v-for 指令遍历数组中的每个 ID。

<template>
    <div>
        <div class="item" v-for="item in items" :key="item.id">
            <ItemComponent :item="item"/>
        </div>
    </div>
</template>

<script>
export default 
    data() 
        return 
            items: []
        
    ,
    created: function() 
        // When component instance has loaded (page load)
        // Call your laravel endpoint
        this.$http.get("/laravel/endpoint").then((res) => 
            this.items = res.body.items
        ).catch((error) => 
            console.log(error);
        );
    

</script>

现在,如果您想将 一个 ID 作为路由参数传递,那么您可以在组件中使用 $route.params.id 访问它们,其中 'id' 是您设置的参数的名称在你的 Vue 路由器中使用


    path: '/path/to/view/:id'
    ...

【讨论】:

我实际上想传递项目并让它们可以通过它们的 id 访问,但我希望每个项目都是一个对象,因为我需要使用对象表示法访问对象属性。 @PA-GW items 数组可以是对象数组。我编辑了我的响应,将每个项目对象传递给一个项目组件,可以使用对象表示法访问项目属性。 所以我不再使用 :route 属性将我的项目传递给 vue 了吗?现在我正在使用 this.$http.get() 检索项目?

以上是关于将 Laravel 集合中的 id 参数传递给 Vue 组件的主要内容,如果未能解决你的问题,请参考以下文章

axios将参数传递给laravel路径

axios 将参数传递给 laravel 路由

如何将参数传递给 Laravel 包中的控制器操作?

如何将 vue.js 值作为参数传递给刀片中的路由

将 Laravel 路由参数传递给 JavaScript

如何将参数传递给 Laravel 5 中的隐式控制器?