KVEditor
Editor for HTTP headers / query params / env vars and other key-value lists; supports enable toggle, description column, and auto-appending an empty row.
Basic usage
CfKVEditor renders a KVRow[] (each row { key, value, enabled?, description? }) as an editable table. The last row is always empty — once you type into its key or value, a new empty row is appended automatically, so there is always a row to fill. Click the trailing × to delete a row.
2<script setup lang="ts">
import { ref } from 'vue';
import { CfKVEditor, type KVRow } from '@chufix-design/vue';
const params = ref<KVRow[]>([
{ key: 'page', value: '1', enabled: true },
{ key: 'pageSize', value: '20', enabled: true },
]);
</script>
<template>
<div style="display:flex; flex-direction:column; gap: 12px;">
<CfKVEditor
v-model="params"
key-placeholder="参数名"
value-placeholder="参数值"
/>
<span style="font-size: 12px; color: var(--fg-3);">
条目数:<code>{{ params.filter((r) => r.key.trim()).length }}</code>
</span>
</div>
</template> <script setup>
import { ref } from 'vue';
import { CfKVEditor } from '@chufix-design/vue';
const params = ref<KVRow[]>([
{ key: 'page', value: '1', enabled: true },
{ key: 'pageSize', value: '20', enabled: true },
]);
</script>
<template>
<div style="display:flex; flex-direction:column; gap: 12px;">
<CfKVEditor
v-model="params"
key-placeholder="参数名"
value-placeholder="参数值"
/>
<span style="font-size: 12px; color: var(--fg-3);">
条目数:<code>{{ params.filter((r) => r.key.trim()).length }}</code>
</span>
</div>
</template> import { useState } from 'react';
import { CfKVEditor, type KVRow } from '@chufix-design/react';
export default function Demo() {
const [params, setParams] = useState<KVRow[]>([
{ key: 'page', value: '1', enabled: true },
{ key: 'pageSize', value: '20', enabled: true },
]);
return (
<CfKVEditor
value={params}
onChange={setParams}
keyPlaceholder="Param name"
valuePlaceholder="Param value"
/>
);
} import { useState } from 'react';
import { CfKVEditor } from '@chufix-design/react';
export default function Demo() {
const [params, setParams] = useState<KVRow[]>([
{ key: 'page', value: '1', enabled: true },
{ key: 'pageSize', value: '20', enabled: true },
]);
return (
<CfKVEditor
value={params}
onChange={setParams}
keyPlaceholder="Param name"
valuePlaceholder="Param value"
/>
);
} Enable toggle and description column
Turn on showToggle to add a leftmost checkbox column — disabled rows keep enabled: false in the array so the consumer can filter on it. Turn on showDescription to add a trailing description column. Both are independent optional knobs.
2<script setup lang="ts">
import { computed, ref } from 'vue';
import { CfKVEditor, type KVRow } from '@chufix-design/vue';
const headers = ref<KVRow[]>([
{ key: 'Authorization', value: 'Bearer xxx', enabled: true, description: '鉴权头,每次请求带上' },
{ key: 'Accept', value: 'application/json', enabled: true, description: '声明返回 JSON' },
{ key: 'X-Trace-Id', value: 'auto', enabled: false, description: '调试用,关掉就由网关生成' },
]);
const enabledCount = computed(() => headers.value.filter((r) => r.enabled !== false && r.key.trim()).length);
</script>
<template>
<div style="display:flex; flex-direction:column; gap: 12px;">
<CfKVEditor
v-model="headers"
key-placeholder="Header"
value-placeholder="Value"
show-toggle
show-description
/>
<span style="font-size: 12px; color: var(--fg-3);">
已启用:<code>{{ enabledCount }}</code>
</span>
</div>
</template> <script setup>
import { computed, ref } from 'vue';
import { CfKVEditor } from '@chufix-design/vue';
const headers = ref<KVRow[]>([
{ key: 'Authorization', value: 'Bearer xxx', enabled, description: '鉴权头,每次请求带上' },
{ key: 'Accept', value: 'application/json', enabled, description: '声明返回 JSON' },
{ key: 'X-Trace-Id', value: 'auto', enabled, description: '调试用,关掉就由网关生成' },
]);
const enabledCount = computed(() => headers.value.filter((r) => r.enabled !== false && r.key.trim()).length);
</script>
<template>
<div style="display:flex; flex-direction:column; gap: 12px;">
<CfKVEditor
v-model="headers"
key-placeholder="Header"
value-placeholder="Value"
show-toggle
show-description
/>
<span style="font-size: 12px; color: var(--fg-3);">
已启用:<code>{{ enabledCount }}</code>
</span>
</div>
</template> import { useState } from 'react';
import { CfKVEditor } from '@chufix-design/react';
export default function Demo() {
const [headers, setHeaders] = useState(ref<KVRow[]>([
{ key: 'Authorization', value: 'Bearer xxx', enabled: true, description: '鉴权头,每次请求带上' },
{ key: 'Accept', value: 'application/json', enabled: true, description: '声明返回 JSON' },
{ key: 'X-Trace-Id', value: 'auto', enabled: false, description: '调试用,关掉就由网关生成' },
]));
return (
<>
<CfKVEditor
value={headers}
onChange={setHeaders}
keyPlaceholder="Header"
valuePlaceholder="Value"
showToggle
showDescription
/>
</>
);
} Read-only / disabled
readonly — inputs are read-only but still focusable for copy; disabled — grayed out and not focusable. Neither state renders the delete button or auto-appends new empty rows.
<script setup lang="ts">
import { ref } from 'vue';
import { CfKVEditor, type KVRow } from '@chufix-design/vue';
const env = ref<KVRow[]>([
{ key: 'NODE_ENV', value: 'production', enabled: true },
{ key: 'API_BASE', value: 'https://api.example.com', enabled: true },
{ key: 'CACHE_TTL', value: '3600', enabled: true },
]);
</script>
<template>
<div style="display:flex; flex-direction:column; gap: 16px;">
<div>
<div style="font-size: 12px; color: var(--fg-3); margin-bottom: 4px;">readonly</div>
<CfKVEditor :model-value="env" readonly />
</div>
<div>
<div style="font-size: 12px; color: var(--fg-3); margin-bottom: 4px;">disabled</div>
<CfKVEditor :model-value="env" disabled />
</div>
</div>
</template> <script setup>
import { ref } from 'vue';
import { CfKVEditor } from '@chufix-design/vue';
const env = ref<KVRow[]>([
{ key: 'NODE_ENV', value: 'production', enabled: true },
{ key: 'API_BASE', value: 'https://api.example.com', enabled: true },
{ key: 'CACHE_TTL', value: '3600', enabled: true },
]);
</script>
<template>
<div style="display:flex; flex-direction:column; gap: 16px;">
<div>
<div style="font-size: 12px; color: var(--fg-3); margin-bottom: 4px;">readonly</div>
<CfKVEditor :model-value="env" readonly />
</div>
<div>
<div style="font-size: 12px; color: var(--fg-3); margin-bottom: 4px;">disabled</div>
<CfKVEditor :model-value="env" disabled />
</div>
</div>
</template> import { CfKVEditor } from '@chufix-design/react';
export default function Demo() {
const env = ref<KVRow[]>([
{ key: 'NODE_ENV', value: 'production', enabled: true },
{ key: 'API_BASE', value: 'https://api.example.com', enabled: true },
{ key: 'CACHE_TTL', value: '3600', enabled: true },
]);
return (
<>
<CfKVEditor value={env} readonly />
<CfKVEditor value={env} disabled />
</>
);
} API
| Prop | Type | Default | Description |
|---|---|---|---|
modelValue (Vue) / value (React) | KVRow[] | [] | Row array { key, value, enabled?, description? } |
defaultValue | KVRow[] | [] | Uncontrolled initial value |
keyPlaceholder | string | 'Key' | Header and input placeholder |
valuePlaceholder | string | 'Value' | Header and input placeholder |
showToggle | boolean | false | Show enable toggle column (writes enabled) |
showDescription | boolean | false | Show description column (writes description) |
autoAppend | boolean | true | Auto-append an empty row at the end |
disabled / readonly | boolean | false | Disable / read-only the whole editor |
bordered | boolean | true | Border |
size | 'sm' | 'md' | 'lg' | 'md' | Font size |
Events: onChange(rows) / update:modelValue fires on any row change or auto-append, with the full row array.
反馈与讨论
KVEditor · Discussion