我有两个v数据表正在组件中呈现。第一个文件是从另一个文件导入的,作为匹配的游戏-crud表。这是答案表。第一个表处理answerObject数组的信息,第二个表中也使用该数组填充v-select下拉元素。第一个表(应答表)设置如下所示。它的项正在更新主文件上的answerObjects。
<template>
<v-container>
<v-data-table
:headers="tableHeaders"
:items="items"
class="elevation-1"
>
<template #[`item.display`]="{item}">
<v-text-field
v-model="item.display"
:hide-details="true"
dense
outlined
:autofocus="true"
label="Display"
>
<!-- <v-icon v-if="header.draggable" slot="prepend"
>mdi-drag-vertical</v-icon
> -->
</v-text-field>
</template>
</v-data-table>
</v-container>
</template>
<script>
import draggable from 'vuedraggable'
import _ from 'lodash'
export default {
components: { draggable },
props: {
headers: { type: Array, required: true, default: [] },
defaultItem: { type: Object, required: true, default: {} },
allowDrag: { type: Boolean, required: false, default: false },
useModal: { type: Boolean, required: false, default: false },
data: { type: Array, required: true, default: [] },
},
data: () => ({
dialog: false,
dialogDelete: false,
items: [],
editedIndex: -1,
editedItem: {},
}),
computed: {
tableHeaders() {
let new_headers = JSON.parse(JSON.stringify(this.headers))
new_headers.push({
text: 'Actions',
value: 'actions',
sortable: false,
})
return new_headers
},
},
mounted() {
this.items = _.cloneDeep(this.data)
this.editedItem = _.cloneDeep(this.defaultItem)
},
created() {},
methods: {
addNew() {
console.log('add new')
const addObj = _.cloneDeep(this.defaultItem)
addObj.id = this.items.length + 1
this.items.push(addObj)
this.$emit('input', this.items)
},
},
}
主页设置如下。在这个页面中,您可以看到使用answerObjects数组的第二个具有v-select的v数据表。匹配游戏-crud表是利用第一个表的文件。在主文件上为answerObject设置了一个手表,以便使用匹配的游戏crud表组件中最新的空应答对象来更新它。
<matching-game-crud-table
:headers="headers"
:default-item="default_item"
:data="answerObjects"
allow-drag
v-model="answerObjects"
></matching-game-crud-table>
<v-data-table
:headers="promptHeaders"
:items="prompts"
class="elevation-1"
>
<template #[`item.answer`]="{item, index}">
<v-select
:hide-details="true"
v-model="item.answer"
:items="answerObjects"
item-text="display"
item-value="display"
outlined
dense
label="Choose an answer value"
@input="change($event, true)"
></v-select>
</template>
</v-data-table>
<script>
import draggable from 'vuedraggable'
import _ from 'lodash'
import MatchingGameCrudTable from '../../MatchingGameCrudTable.vue'
export default {
name: 'MatchingGame',
components: { MatchingGameCrudTable, draggable },
props: {
value: { type: String, required: true },
data: { type: Object, required: true },
},
watch: {
answerObjects(newData, oldData) {
console.log(newData)
this.items = [newData]
console.log(this.items)
// this.mainBucket = this.setMainBucket()
},
},
data(){
return{
default_item: {
id: 0,
display: '',
feedback: '',
},
prompts: [],
answerObjects: [],
items: [],
}
}
</script>
似乎正在发生的问题是,如果我向应答表添加了一个新的答案,那么将调用addNew函数,并使用一个空的应答对象更新answerObjects数组。由于某种原因,如果我在第二个表中还有一个空的提示对象还没有被填充,那么prompt.answer键就是"“。然后,v-select将在提示应答时接受空应答对象。所以当我在空答案对象中填写一个答案时。提示答复是链接的,并与它一起更新。但是即时的回答仍然是"",它只是更新v-select下拉列表。我想让v-select保持不被选择。然后下拉列表应该填充答案值,但是用户应该手动选择它。我不知道为什么会出现这种联系。
发布于 2022-08-31 20:23:45
我建议您从像vuex这样的中心状态获取数据,如果在第一个表上触发了v-select,它就会更改状态,那么第二个表将使用已更改的状态。
https://stackoverflow.com/questions/73544338
复制相似问题