如何在 Vuetify 数据表中连接外部数据

Posted

技术标签:

【中文标题】如何在 Vuetify 数据表中连接外部数据【英文标题】:How to wire up external data in Vuetify datatables 【发布时间】:2018-08-10 00:25:18 【问题描述】:

我刚开始使用 Vue 并发现了 Vuetify(并且印象非常深刻)。我也是 node.js 的新手,但有一些经验。

我正在尝试找到一些将数据从外部 API 加载到 vuetify 数据网格中的示例 - CRUD 类型的东西,相当大量的数据分页。 Vuetify 中的文档在这方面有点欠缺。我应该使用 Vuex 吗?

【问题讨论】:

【参考方案1】:

如果您想使用 REST 调用外部 API,则需要使用 axios,这是一个 NPM 包,允许您进行 GET、POST 和所有此类操作。

我们以online working API 为例。首先,您需要通过调用此 API 来获取数据。网上有一个很好的教程会告诉你更多细节,但是让我们使用这段代码。

this.todos = axios.get('https://jsonplaceholder.typicode.com/todos/')
  .then(response =>  this.todos = response.data )
  .catch(error =>  console.log(error));

那么你只需要像the documentation那样使用数据表。这是一个CodePen,可以帮助您简要了解我是如何进行 API 调用并显示它的。这一切都来自官方文档,只是修改为调用 REST API。我将代码也放在这里,以便为将来的读者保存它。

<div id="app">
  <v-app id="inspire">
    <div>
      <v-toolbar flat color="white">
        <v-toolbar-title>Todos CRUD</v-toolbar-title>
        <v-divider
          class="mx-2"
          inset
          vertical
        ></v-divider>
        <v-spacer></v-spacer>
        <v-dialog v-model="dialog" max->
          <v-btn slot="activator" color="primary" dark class="mb-2">New Item</v-btn>
          <v-card>
            <v-card-title>
              <span class="headline"> formTitle </span>
            </v-card-title>

            <v-card-text>
              <v-container grid-list-md>
                <v-layout wrap>
                  <v-flex xs12 sm6 md4>
                    <v-text-field v-model="editedItem.userId" label="User ID"></v-text-field>
                  </v-flex>
                  <v-flex xs12 sm6 md4>
                    <v-text-field v-model="editedItem.id" label="ID"></v-text-field>
                  </v-flex>
                  <v-flex xs12 sm6 md4>
                    <v-text-field v-model="editedItem.title" label="Title"></v-text-field>
                  </v-flex>
                  <v-flex xs12 sm6 md4>
                    <v-checkbox v-model="editedItem.completed" label="Completed?"></v-checkbox> 
                  </v-flex>
                </v-layout>
              </v-container>
            </v-card-text>

            <v-card-actions>
              <v-spacer></v-spacer>
              <v-btn color="blue darken-1" flat @click="close">Cancel</v-btn>
              <v-btn color="blue darken-1" flat @click="save">Save</v-btn>
            </v-card-actions>
          </v-card>
        </v-dialog>
      </v-toolbar>
      <v-data-table
        :headers="headers"
        :items="todos"
        class="elevation-1"
      >
        <template slot="items" slot-scope="props">
          <td class="text-xs-right"> props.item.userId </td>
          <td class="text-xs-right"> props.item.id </td>
          <td class="text-xs-right"> props.item.title </td>
          <td class="text-xs-right"> props.item.completed </td>
          <td class="justify-center layout px-0">
            <v-icon
              small
              class="mr-2"
              @click="editItem(props.item)"
            >
              edit
            </v-icon>
            <v-icon
              small
              @click="deleteItem(props.item)"
            >
              delete
            </v-icon>
          </td>
        </template>
        <template slot="no-data">
          <v-btn color="primary" @click="initialize">Reset</v-btn>
        </template>
      </v-data-table>
    </div>
  </v-app>
</div>

然后是关联的JS。

new Vue(
  el: '#app',
  data: () => (
    dialog: false,
    headers: [
      
        text: 'User ID',
        align: 'left',
        sortable: false,
        value: 'userId',
        width: '10'
      ,
       text: 'ID', value: 'id', width: '10' ,
       text: 'Title', value: 'title' ,
       text: 'Completed', value: 'completed' 
    ],
    todos: [],
    editedIndex: -1,
    editedItem: 
      userId: 0,
      id: 0,
      title: '',
      completed: false
    ,
    defaultItem: 
      userId: 0,
      id: 0,
      title: '',
      completed: false
    
  ),

  computed: 
    formTitle () 
      return this.editedIndex === -1 ? 'New Item' : 'Edit Item'
    
  ,

  watch: 
    dialog (val) 
      val || this.close()
    
  ,

  created () 
    this.initialize()
  ,

  methods: 
    initialize () 
      this.todos = axios.get('https://jsonplaceholder.typicode.com/todos/')
      .then(response =>  this.todos = response.data )
      .catch(error =>  console.log(error));
    ,

    editItem (item) 
      this.editedIndex = this.todos.indexOf(item)
      this.editedItem = Object.assign(, item)
      this.dialog = true
    ,

    deleteItem (item) 
      const index = this.todos.indexOf(item)
      confirm('Are you sure you want to delete this item?') && this.todos.splice(index, 1)
    ,

    close () 
      this.dialog = false
      setTimeout(() => 
        this.editedItem = Object.assign(, this.defaultItem)
        this.editedIndex = -1
      , 300)
    ,

    save () 
      if (this.editedIndex > -1) 
        Object.assign(this.todos[this.editedIndex], this.editedItem)
       else 
        this.todos.push(this.editedItem)
      
      this.close()
    
  
)

【讨论】:

以上是关于如何在 Vuetify 数据表中连接外部数据的主要内容,如果未能解决你的问题,请参考以下文章

未登录时如何删除全局侧边栏(vuetify)

如何在 Vuetify 数据表项道具中显示嵌套数据?

如何在 2.0 中获取 vuetify 数据表选择的 itemsPerPage?

如何使用 vuetify 在 vue 中显示两个数据库表中的数据

Vuetify 使用带有 Vuex 的 API 的外部数据的数据表

如何在鼠标悬停在使用 Vuetify 数据表的表格时显示按钮