如何将 Laravel 资源 API 数据传递给 Vuejs?

Posted

技术标签:

【中文标题】如何将 Laravel 资源 API 数据传递给 Vuejs?【英文标题】:How to pass Laravel Resource API data to Vuejs? 【发布时间】:2018-08-05 14:03:15 【问题描述】:

如果我 return Record::all(); 使用 Axios 进入 Vuetify 数据表,数据将显示。但是如果我使用 return RecordResource::collection(Record::all()); ,数据甚至不会存储在局部变量中。

我检查了网络选项卡中的数据,数据在那里,但在 Vue 选项卡中,数据表中没有数据。也没有错误。

这是我的控制器:

<?php

namespace App\Http\Controllers;

use App\Record;
use Illuminate\Http\Request;
use App\Http\Resources\RecordResource;
use App\Http\Resources\RecordCollection;

class RecordController extends Controller

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    
        return RecordResource::collection(Record::all());
    

这是我的 Vuejs 脚本:

 <script>
  export default 
    data () 
      return 
        search: '',
        totalItems: 0,
        items: [],
        loading: true,
        pagination: ,
        headers: [
          
            text: 'Teacher Name',
            align: 'left',
            value: 'user'
          ,
           text: 'Type', align: 'center', value: 'type' ,
           text: 'Time', align: 'center', value: 'time' 
        ]
      
    ,
    watch: 
      pagination: 
        handler () 
          this.getDataFromApi()
            .then(data => 
              this.items = data.items
              this.totalItems = data.total
              console.log(this.items)
            )
        ,
        deep: true
      
    ,
    mounted () 
      this.getDataFromApi()
        .then(data => 
          this.items = data.items
          this.totalItems = data.total
        )
    ,
    methods: 
      getDataFromApi () 
        this.loading = true
        return new Promise((resolve, reject) => 
          const  sortBy, descending, page, rowsPerPage  = this.pagination
          let items = []
          this.$http.get('http://localhost:8000/api/records')
          .then(response => 
            items = response.data
          )
          .catch(error => 
            console.log(error);
          );

          const total = items.length


          if (this.pagination.sortBy) 
            items = items.sort((a, b) => 
              const sortA = a[sortBy]
              const sortB = b[sortBy]

              if (descending) 
                if (sortA < sortB) return 1
                if (sortA > sortB) return -1
                return 0
               else 
                if (sortA < sortB) return -1
                if (sortA > sortB) return 1
                return 0
              
            )
          

          if (rowsPerPage > 0) 
            items = items.slice((page - 1) * rowsPerPage, page * rowsPerPage)
          

          setTimeout(() => 
            this.loading = false
            resolve(
              items,
              total
            )
          , 1000)
        )
      
    
  
</script>

我的记录资源如下所示

    public function toArray($request)
    
        return [
            'user' => User::find($this->user_id)->fname . " " . User::find($this->user_id)->mname . " " . User::find($this->user_id)->lname,
            'type' => $this->created_at->hour < 12 ? 'Morning ' . $this->type : 'Afternoon ' . $this->type,
            'time' => $this->created_at->toDayDateTimeString()
        ];
    

来自 API 资源的示例数据

// 20180227062317
// http://localhost:8000/api/records

[
  
    "user": "Chadd Q. Rau",
    "type": "Afternoon In",
    "time": "Sun, Jan 28, 2018 8:22 PM"
  ,
  
    "user": "Rosalind J. Sanford",
    "type": "Morning In",
    "time": "Tue, Jan 23, 2018 12:15 AM"
  ,
  
    "user": "Rosalind J. Sanford",
    "type": "Morning In",
    "time": "Mon, Feb 12, 2018 12:45 AM"
  
]

【问题讨论】:

您是否尝试比较返回all() 和返回collection 时的json?可能数据的格式不符合预期。 由于 API 资源,它们返回相同的格式但结果不同 数据表仅适用于参与的结果。也许您对格式或内容有疑问。一个样本可以帮助找出问题所在。正如@Bitfumes 所说,一些库会在 json 的根目录上添加一个“数据”键,这将在 axios 上产生一个response.data.data 我编辑了我的帖子。 @cbaconnier。我还从资源中删除了数据包装,以便响应只有 1 个数据包装 我换个方式问你:你能确认一下,all()方法和collection()方法之间,network选项卡上的json是一模一样的吗? 【参考方案1】:

为什么要创建 item 变量,而不是在 vie data() 中定义一个数据字段

data()
  return 
    item : 
  

现在在你的 axios 中

axios.get('http://localhost:8000/api/records')
      .then(response => 
        this.items = response.data
      )
      .catch(error => 
        console.log(error);
      );

如果您使用的是 resource::collection,那么您可能必须在 .then 部分中说 response.data.data

【讨论】:

以上是关于如何将 Laravel 资源 API 数据传递给 Vuejs?的主要内容,如果未能解决你的问题,请参考以下文章

如何将JSON数据传递给laravel中的视图

如何将 Sql 行数据传递给 Vue 文件(Laravel 项目)

laravel livewire,如何通过单击将 id 或数据传递给另一个组件

Flutter如何将表单数据传递给api

无论控制器如何,如何在 Laravel 中将数据传递给布局?

如何将 api 响应数据传递给视频播放器