【问题标题】:How do I properly update Vuex state from my Vuetify data-table如何从我的 Vuetify 数据表中正确更新 Vuex 状态
【发布时间】:2018-09-03 02:35:25
【问题描述】:

我正在使用 Vue、Vuex 和 Vuetify 在数据表中显示课程,并希望将内联编辑作为一项功能。请参阅下面的相关组件代码。

#Courses.vue

<template>
  <v-data-table 
  :headers="headers"
  :items="courses"
  :search="search"
  :loading="loading"
  no-data-text="No Courses Available"
  >

    <template slot="items" slot-scope="props">
      <tr>
        <td>
          <v-edit-dialog
          :return-value.sync="props.item.title"
          lazy
          >
            {{ props.item.title }}
            <v-text-field
            slot="input"
            label="Enter New Course Title"
            v-model="props.item.title"
            single-line
            counter
            @keyup.enter="onUpdateCourse({ id: props.item.id, title: props.item.title})"
            ></v-text-field>
          </v-edit-dialog>
        </td>

        <td>{{ props.item.category }}</td>
        <td>{{ props.item.startDate | date }}</td>
        <td>{{ props.item.endDate | date }}</td>
        <td>{{ props.item.location }}</td>
      </tr>
    </template>
  </v-data-table>
</template>

<script>
  export default {
    data() {
      return {
        headers: [** table headings **],
      };
    },
    computed: {
      courses() {
        return this.$store.getters.courses;
      },
    },
    methods: {
      onUpdateCourse(itemToUpdate) {
        debugger;
        this.$store.dispatch('updateCourse', itemToUpdate);
      },
    },
  };
</script>

有效;但我对这种方法直接改变 Vuex 状态这一事实提出异议:dispatch('updateCourse', itemToUpdate) 的唯一原因是更新数据库(在这种情况下为 firestore)。我认为最好只通过 Vuex 操作/突变来更新 $store.state,而不是直接在此处同步。

所以,我的第一个问题是:我应该对此提出异议吗?如果不是,为什么不呢?

因为它打扰了我,所以我将 Vuex 课程数组的本地副本添加到计算部分:

localCopy() {
  return this.courses.map(x => Object.assign({}, x));
},

并使用:items="localCopy" 构建数据表。这允许我从 Vuex 操作中更新课程,但数据表不会更新,直到我单击应用程序中的其他位置。

那么,我的第二个问题是:如果这是正确的方法,我如何保持组件的反应性?

感谢您的帮助。

(PS – 在剪切和粘贴代码或在文本框中编辑时,似乎有些双引号 " 不幸地被转换为花哨的引号 。不幸的是,我有阅读障碍,并且虽然我已经尽我所能去追捕他们,但我真的大部分时间都看不到他们。请不要讨厌我)

【问题讨论】:

    标签: vue.js vuex vuetify.js


    【解决方案1】:

    要不将更改分配给props.item.title,请执行以下操作:

    • 删除&lt;v-edit-dialog :return-value="props.item.title"中的.sync
    • &lt;v-text-field :value="props.item.title" 中将v-model 替换为:value

    作为.sync has an implicit @return-value:update="props.item.title = $event"v-model has an implicit @input="props.item.title = $event (roughly),仅以上内容(删除.sync 并将v-model 替换为:value)将阻止title 被直接修改。

    要通过dispatch 对其进行修改,还要添加一个调用调度的@input 侦听器:@input="onUpdateCourse({ id: props.item.id, title: props.item.title})"

    最后,你的代码应该是这样的:

    <td>
      <v-edit-dialog
      :return-value="props.item.title"
      lazy
      >
        {{ props.item.title }}
        <v-text-field
        slot="input"
        label="Enter New Course Title"
        :value="props.item.title"
        @input="onUpdateCourse({ id: props.item.id, title: props.item.title})"
        single-line
        counter
        @keyup.enter="onUpdateCourse({ id: props.item.id, title: props.item.title})"
        ></v-text-field>
      </v-edit-dialog>
    </td>
    

    【讨论】:

    • 感谢您的简明解释
    • 如果要获取新值,请使用 $event.target.value 或 $event
    猜你喜欢
    • 2020-09-08
    • 2020-05-18
    • 2018-12-21
    • 2021-06-07
    • 2021-07-21
    • 2020-11-04
    • 2023-03-16
    • 2017-09-06
    • 2021-06-19
    相关资源
    最近更新 更多