【发布时间】: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