quality-inspection-platform/frontend-admin/src/components/KeyValueEditor.vue
qihongkun d810abdcee 初始化仓库:AI 接口自动化测试平台
纳入 FastAPI 后端、Vue 管理端、MCP 桥接与文档;通过 .gitignore 排除本地数据库与构建产物。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-22 15:44:50 +08:00

75 lines
1.9 KiB
Vue

<script setup>
import { Delete, Plus } from "@element-plus/icons-vue";
const props = defineProps({
modelValue: {
type: Array,
default: () => [{ key: "", value: "" }],
},
keyPlaceholder: {
type: String,
default: "Key",
},
valuePlaceholder: {
type: String,
default: "Value",
},
addLabel: {
type: String,
default: "新增一行",
},
});
const emit = defineEmits(["update:modelValue"]);
function updateRows(nextRows) {
emit("update:modelValue", nextRows);
}
function updateRow(index, field, value) {
const nextRows = props.modelValue.map((row, rowIndex) =>
rowIndex === index ? { ...row, [field]: value } : row
);
updateRows(nextRows);
}
function addRow() {
updateRows([...props.modelValue, { key: "", value: "" }]);
}
function removeRow(index) {
const nextRows = props.modelValue.slice();
nextRows.splice(index, 1);
if (!nextRows.length) {
nextRows.push({ key: "", value: "" });
}
updateRows(nextRows);
}
</script>
<template>
<div class="kv-editor">
<div class="kv-editor__head">
<span class="kv-editor__col">Key</span>
<span class="kv-editor__col">Value</span>
<span class="kv-editor__action" aria-hidden="true" />
</div>
<div class="kv-editor__list">
<div v-for="(row, index) in modelValue" :key="index" class="kv-editor__row">
<el-input :model-value="row.key" :placeholder="keyPlaceholder" @update:model-value="updateRow(index, 'key', $event)" />
<el-input
:model-value="row.value"
:placeholder="valuePlaceholder"
@update:model-value="updateRow(index, 'value', $event)"
/>
<el-button circle :icon="Delete" text type="danger" @click="removeRow(index)" />
</div>
</div>
<el-button :icon="Plus" text type="primary" class="kv-editor__add" @click="addRow">
{{ addLabel }}
</el-button>
</div>
</template>