我正在使用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状态这一事实表示怀疑:调度('updateCourse',itemToUpdate)的唯一原因是更新db(在本例中为firestore)。我原本认为最好只通过Vuex动作/突变来更新$ store.state,而不是直接在这里同步。
所以,我的第一个问题是:我是否应该对此提出异议,如果不是,为什么不呢?
因为它让我烦恼,我在计算部分添加了Vuex course数组的本地副本:
localCopy() {
return this.courses.map(x => Object.assign({}, x));
},
使用:items="localCopy"
构建数据表。这允许我从Vuex操作中更新课程,但在我点击应用程序中的其他位置之前,数据表不会更新。
所以,我的第二个问题是:如果这是正确的方法,我该如何保持组件的反应性?
感谢您的帮助。
(PS - 在剪切和粘贴代码或在文本框中进行编辑时,似乎有些双引号"
很难转换为花哨的引号“
。这是非常不幸的我是阅读障碍者,尽管我已经尽力去追捕他们,但我大部分时间都看不到他们。请不要讨厌我。
答案 0 :(得分:5)
要不将更改分配给props.item.title
,请执行:
.sync
中的<v-edit-dialog :return-value="props.item.title"
。v-model
替换为:value
中的<v-text-field :value="props.item.title"
。仅.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>