我在 Vue 3 项目中使用 vuedraggable 来允许对扩展面板中的元素进行重新排序。可以将元素拖放到面板内的新位置,但释放后它们会恢复到原始位置。我怀疑当元素移动时 vuedraggable 使用的底层列表没有更新,这导致它们重置到原始位置。这是我的代码的相关部分:
<v-expansion-panels>
<v-expansion-panel v-for="feature in groupedFeatures" :key="feature.type">
<v-expansion-panel-title>
<div>{{ translateFeatureType(feature.type) }}</div>
</v-expansion-panel-title>
<v-expansion-panel-text>
<draggable v-model="feature.details" group="featureGroup" item-key="model_name">
<template #item="{element, index}">
<div :key="element.model_name">
<p><strong>Model:</strong> {{ element.model_name }}</p>
<p>{{ element.value }}</p>
</div>
</template>
</draggable>
</v-expansion-panel-text>
</v-expansion-panel>
</v-expansion-panels>
我的进口:
import { ref, onMounted, computed } from 'vue';
import axios from 'axios';
import { useRoute } from 'vue-router';
import draggable from 'vuedraggable';
const route = useRoute();
const features = ref([]);
const messages = ref([]);
onMounted 函数:
onMounted(async () => {
const threadData = await fetchEmailThreads(route.params.id);
if (threadData) {
features.value = threadData.features;
messages.value = threadData.messages;
}
以及 groupedFeatures 函数
const groupedFeatures = computed(() => {
const featureMap = new Map();
features.value.forEach(f => {
if (!featureMap.has(f.type)) {
featureMap.set(f.type, { type: f.type, details: [] });
}
featureMap.get(f.type).details.push({ model_name: f.model_name, value: f.value });
});
return Array.from(featureMap.values());
});
服务器提供的数据是这样的:
{
"chat_id": 1,
"features": [
{
"model_name": "Vicuna-13B",
"type": "abstract_feature",
"value": "---Feature Content---"
},
{
"model_name": "Vicuna-13B",
"type": "generated_feature",
"value": "---Feature Content---"
},
{
"model_name": "Vicuna-13B",
"type": "generated_feature",
"value": "---Feature Content---"
},
{
"model_name": "Vicuna-13B",
"type": "order_feature",
"value": "---Feature Content---"
},
{
"model_name": "Solaris-13B",
"type": "abstract_feature",
"value": "---Feature Content---"
},
{
"model_name": "Solaris-13B",
"type": "generated_feature",
"value": "---Feature Content---"
},
{
"model_name": "Solaris-13B",
"type": "generated_feature",
"value": "---Feature Content---"
},
{
"model_name": "Solaris-13B",
"type": "order_feature",
"value": "---Feature Content---"
}
],
"inst_id": 0,
"messages": [
{
"content": "Message Content...",
"message_id": 1,
"sender": "sender1",
"timestamp": "2022-11-08T14:15:00"
},
{
"content": "Message Content...",
"message_id": 2,
"sender": "sender2",
"timestamp": "2022-11-09T15:45:00"
}
],
"subject": "Topic"
}
我需要进行哪些更改才能使实际列表中的元素相应更新,并且元素在移动后保持在新位置?
您的 groupedFeatures 不是 vue 引用,而是计算值。您无法使用可拖动的回调来更新它。
我建议不要根据 features 变量的值来计算它,而是在 onMounted 回调(您设置功能的位置)中计算一次。
const groupedFeatures = ref([]);
onMounted(async() => {
const threadData = await fetchEmailThreads(route.params.id);
if (!threadData) return;
const featureMap = new Map();
features.value.forEach(f => {
if (!featureMap.has(f.type)) {
featureMap.set(f.type, {
type: f.type,
details: []
});
}
featureMap.get(f.type).details.push({
model_name: f.model_name,
value: f.value
});
});
groupedFeatures.value = Array.from(featureMap.values());
});
这应该可以解决您的问题。