Vuetify数据表在状态更新时不会重新加载

时间:2019-10-06 09:40:49

标签: vue.js vuex vuetify.js

我想向您询问有关Vuetify及其数据表的信息。我正在使用Vuex进行状态管理。当我打开页面时,Vuex从API加载所有数据。它运作完美。然后,我有了数据表,它也可以工作(更新,添加,删除),但是只有一列不起作用...数据表中填充了GET_CENTERS,而“一个列”是一个对象(center.customer)。当我更改center.customer.name状态时,数据库也会更新,但数据表中的值不会更新。 (我尝试只在同一页面上创建客户列表,如果设置了:key,则此列表会更改)。

CentersTable

<template>
    <div>

    <v-data-table
            :headers="headers"
            :items="GET_CENTERS"
            sort-by="name"
            class="elevation-1"
    >

        <template v-slot:top>
            <v-toolbar flat color="white">
                <v-toolbar-title>My CRUD</v-toolbar-title>
                <v-divider
                        class="mx-4"
                        inset
                        vertical
                ></v-divider>
                <div class="flex-grow-1"></div>
                <v-dialog v-model="dialog" max-width="500px">
                    <template v-slot:activator="{ on }">
                        <v-btn color="primary" dark class="mb-2" v-on="on">Nový Záznam</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="6">
                                        <v-text-field v-model="editedItem.name" label="Název"></v-text-field>
                                    </v-col>
                                    <v-col cols="12" sm="6" md="6">
                                        <v-text-field v-model="editedItem.address" label="Adresa"></v-text-field>
                                    </v-col>
                                    <v-col cols="12" sm="6" md="6">
                                        <v-text-field v-model="editedItem.city" label="Město"></v-text-field>
                                    </v-col>
                                    <v-col cols="12" sm="6" md="6">
                                        <v-text-field v-model="editedItem.zip" label="PSČ"></v-text-field>
                                    </v-col>
                                    <v-col cols="12" sm="6" md="6">
                                        <v-text-field v-model="editedItem.email" label="Email"></v-text-field>
                                    </v-col>
                                    <v-col cols="12" sm="6" md="6">
                                        <v-text-field v-model="editedItem.phone" label="Telefon"></v-text-field>
                                    </v-col>
                                    <v-col cols="12" sm="12" md="12">
                                        <v-combobox
                                                v-model="editedItem.customer"
                                                :items="GET_CUSTOMERS"
                                                :search-input.sync="search"
                                                item-text="name"
                                                item-value="_id"
                                                :hide-selected="hideSelected"
                                                label="Zákazník"
                                                persistent-hint
                                                :clearable="clearable"
                                                return-object
                                        >
                                            <template v-if="noData" v-slot:no-data>
                                                <v-list-item>
                                                    <v-list-item-content>
                                                        <v-list-item-title>
                                                            No results matching "<strong>{{ search }}</strong>". Press <kbd>enter</kbd> to create a new one
                                                        </v-list-item-title>
                                                    </v-list-item-content>
                                                </v-list-item>
                                            </template>
                                        </v-combobox>
                                    </v-col>

                                </v-row>
                            </v-container>
                        </v-card-text>

                        <v-card-actions>
                            <div class="flex-grow-1"></div>
                            <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-toolbar>
        </template>
        <template v-slot:item.action="{ item }">
            <v-icon
                    small
                    class="mr-2"
                    @click="editItem(item)"
            >
                edit
            </v-icon>
            <v-icon
                    small
                    @click="deleteItem(item)"
            >
                delete
            </v-icon>
        </template>

    </v-data-table>
    <template>
        <v-list-item v-for="item in GET_CUSTOMERS" :key="item._id">
            <v-list-item-content>{{item}}</v-list-item-content>
        </v-list-item>
    </template>
    </div>
</template>

<script>
  import {mapActions, mapGetters} from 'vuex'
  export default {
    name: "CentersTable",
    data: () => ({
      dialog: false,
      editedItem: {},
      headers: [
        {
          text: 'Název',
          align: 'left',
          sortable: true,
          value: 'name',
        },
        {
          text: 'Adresa',
          sortable: true,
          value: 'address',
        },
        {
          text: 'Město',
          sortable: true,
          value: 'city',
        },
        {
          text: 'PSČ',
          sortable: true,
          value: 'zip',
        },
        {
          text: 'Email',
          sortable: true,
          value: 'email',
        },
        {
          text: 'Telefon',
          sortable: true,
          value: 'phone',
        },
        {
          text: 'Zákazník',
          sortable: true,
          value: 'customer.name',
        },
        { text: 'Akce', value: 'action', sortable: false, align: 'right' },
      ],
      search: null,
      chips: true,
      multiple: true,
      hideSelected: true,
      noData: true,
      clearable: false,
    }),

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

    computed: {
      formTitle() {
        return this.editedItem._id === undefined ? 'Nový Záznam' : 'Upravit Záznam'
      },
      ...mapGetters([
        'GET_CUSTOMERS',
        'GET_CENTERS'
      ]),
    },

    methods: {
      ...mapActions([
        'createCenter',
        'updateCenter',
        'deleteCenter',
      ]),

      editItem (item) {
        this.editedItem = Object.assign({}, item)
        this.dialog = true
      },

      deleteItem (item) {
        confirm('Opravdu chcete smazat tento záznam?') && this.deleteCenter(item).then(() => {
          this.$noty.success('Záznam byl smazán')
        }).catch(() => {
          this.$noty.alert('Při mazání záznamu došlo k chybě')
        })
      },

      close () {
        this.dialog = false
        this.editedItem = {}
        setTimeout(() => {
        }, 300)
      },

      save () {
        if (this.editedItem._id === undefined) {
          this.createCenter(this.editedItem).then(() => {
            this.$noty.success('Nový zákazník byl vytvořen')
          }).catch(() => {
            this.$noty.alert('Při vytváření zákazníka došlo k chybě')
          })
        } else {
          this.updateCenter(this.editedItem).then(() => {
            this.$noty.success('Záznam byl upraven')
          }).catch(() => {
            this.$noty.alert('Při ukládání záznamu došlo k chybě')
          })
        }
        this.close()
      },
    }
  }
</script>

<style scoped>

</style>

还有Vuex商店

import axios from "axios";
import Vue from "vue";

const state = {
  customers: []
};

const mutations = {
  SET_CUSTOMERS(state, payload) {
    state.customers = payload;
  },
  UPDATE_CUSTOMER(state, payload) {
    const customer = state.customers.findIndex(x => x._id === payload._id);
    Vue.set(state.customers, customer, payload);
  },
  ADD_CUSTOMER(state, payload) {
    state.customers.push(payload);
  },
  REMOVE_CUSTOMER(state, payload) {
    const customer = state.customers
      .map(customer => customer._id)
      .indexOf(payload);
    state.customers.splice(customer, 1);
  }
};

const actions = {
  loadCustomers({ commit }) {
    axios.get("/api/customers").then(data => {
      commit("SET_CUSTOMERS", data.data);
    });
  },
  updateCustomer({ commit }, payload) {
    axios.put(`/api/customers/${payload._id}`, payload).then(response => {
      commit("UPDATE_CUSTOMER", response.data);
    });
  },
  createCustomer({ commit }, payload) {
    axios.post("/api/customers", payload).then(data => {
      commit("ADD_CUSTOMER", data.data);
    });
  },
  deleteCustomer({ commit }, payload) {
    axios.delete(`/api/customers/${payload._id}`).then(() => {
      commit("REMOVE_CUSTOMER", payload);
    });
  }
};

const getters = {
  GET_CUSTOMERS: state => state.customers
};

export default {
  state,
  mutations,
  actions,
  getters
};

0 个答案:

没有答案