使用 laravel Inertia JS Vuetify DataTable

Posted

技术标签:

【中文标题】使用 laravel Inertia JS Vuetify DataTable【英文标题】:Vuetify DataTable with laravel Inertia JS 【发布时间】:2021-04-09 10:52:32 【问题描述】:

请帮助我,我是惯性新手,我打算使用 vuetify 数据表创建用户 crud 页面,但我被困在这里。

我的问题是如何将用户数据从后端分配到数据表中,因为 vuetify 数据表中没有 tr/td 标签?

我已经尝试在互联网上搜索,但那里的大部分教程都是使用 tailwindcss。

< script >
  export default 
    data: () => (
      dialog: false,
      dialogDelete: false,
      headers: [
          text: 'Name',
          align: 'start',
          sortable: false,
          value: 'name',
        ,
        
          text: 'Email',
          value: 'email'
        ,
        
          text: 'Roles',
          value: 'roles'
        ,
        
          text: 'Actions',
          value: 'actions',
          sortable: false
        ,
      ],
      users: [],
      editedIndex: -1,
      editedItem: 
        name: '',
        email: '',
        roles: '',
      ,
      defaultItem: 
        name: '',
        email: '',
        roles: '',
      ,
    ),

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

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

    created() 
      this.initialize()
    ,

    methods: 
      initialize() 
        this.users = users
      ,

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

      deleteItem(item) 
        this.editedIndex = this.users.indexOf(item)
        this.editedItem = Object.assign(, item)
        this.dialogDelete = true
      ,

      deleteItemConfirm() 
        this.users.splice(this.editedIndex, 1)
        this.closeDelete()
      ,

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

      closeDelete() 
        this.dialogDelete = false
        this.$nextTick(() => 
          this.editedItem = Object.assign(, this.defaultItem)
          this.editedIndex = -1
        )
      ,

      create() 
        this.$inertia.visit(route('organizations.create'))
      ,
      edit(_organisation) 
        this.$inertia.visit(route('organizations.edit', _organisation))
      ,
    
   <
  /script>
<template>
  <v-data-table
    :headers="headers"
    :items="users"
    sort-by="name"
    class="elevation-1"
  >
    <template v-slot:top>
      <v-toolbar
        flat
      >
        <v-toolbar-title>My CRUD</v-toolbar-title>
        <v-divider
          class="mx-4"
          inset
          vertical
        ></v-divider>
        <v-spacer></v-spacer>
        <v-dialog
          v-model="dialog"
          max-
        >
          <template v-slot:activator=" on, attrs ">
            <v-btn
              color="primary"
              dark
              class="mb-2"
              v-bind="attrs"
              v-on="on"
            >
              New User
            </v-btn>
          </template>
<v-card>
  <v-card-title>
    <span class="headline"> formTitle </span>
  </v-card-title>

  <v-card-text>
    <v-container>
      <v-row>
        <v-col cols="12" sm="6" md="4">
          <v-text-field v-model="editedItem.name" label="Name"></v-text-field>
        </v-col>
        <v-col cols="12" sm="6" md="4">
          <v-text-field v-model="editedItem.email" label="Email"></v-text-field>
        </v-col>
        <v-col cols="12" sm="6" md="4">
          <v-text-field v-model="editedItem.Roles" label="Roles"></v-text-field>
        </v-col>
      </v-row>
    </v-container>
  </v-card-text>

  <v-card-actions>
    <v-spacer></v-spacer>
    <v-btn color="blue darken-1" text @click="close">
      Cancel
    </v-btn>
    <v-btn color="blue darken-1" text @click="save">
      Save
    </v-btn>
  </v-card-actions>
</v-card>
</v-dialog>
<v-dialog v-model="dialogDelete" max->
  <v-card>
    <v-card-title class="headline">Are you sure you want to delete this user?</v-card-title>
    <v-card-actions>
      <v-spacer></v-spacer>
      <v-btn color="blue darken-1" text @click="closeDelete">Cancel</v-btn>
      <v-btn color="blue darken-1" text @click="deleteItemConfirm">OK</v-btn>
      <v-spacer></v-spacer>
    </v-card-actions>
  </v-card>
</v-dialog>
</v-toolbar>
</template>
<template v-slot:item.actions=" item ">
      <v-icon
        small
        class="mr-2"
        @click="editItem(item)"
      >
        mdi-pencil
      </v-icon>
      <v-icon
        small
        @click="deleteItem(item)"
      >
        mdi-delete
      </v-icon>
    </template>
<template v-slot:no-data>
      <v-btn
        color="primary"
        @click="initialize"
      >
        Reset
      </v-btn>
    </template>
</v-data-table>
</template>

【问题讨论】:

【参考方案1】:

您需要从您的data 对象中删除空的users: [],并通过props 从后端接收用户。

export default 
   props: ['users']

这样,Inertia 会自动将传递给Inertia::render 的数据绑定到您的页面组件。

【讨论】:

以上是关于使用 laravel Inertia JS Vuetify DataTable的主要内容,如果未能解决你的问题,请参考以下文章

在 Inertia.js Vue 文件中访问 Laravel 的 .env 变量

如何使用 Inertia Js、Vue 和 Laravel 重新加载持久布局或观看道具

Laravel 8 + Inertia 不渲染变量

Laravel Vue Inertia 需要对 app.blade 中的脚本资产进行硬刷新,每次更改路线

为 Vue 使用 2 个不同的刀片根模板,以及 Laravel 8 和 Inertia?

Laravel Inertia (Vue) - 无需重定向即可进行身份验证