vxe-table 自定义数字行主键,解决默认字符串主键与后端类型不匹配问题
<p>vxe-table 自定义数字行主键,解决默认字符串主键与后端类型不匹配问题<br>在使用 vxe-table 表格组件时,组件默认自动生成的行主键为字符串类型,但后端接口通常要求主键为数值(number)类型,直接提交会因数据类型不匹配导致接口报错。<br>
有两种最优解决方案,支持局部配置和全局统一配置,彻底解决类型不兼容问题。</p>
<h2 id="核心解决方案">核心解决方案</h2>
<p>vxe-table 提供了灵活的主键配置能力,推荐两种实用方案:</p>
<ol>
<li>指定业务字段为主键:直接使用后端返回的数字 ID 作为行主键(推荐已有数据场景)</li>
<li>自定义主键生成方法:自定义生成数字类型的自增主键(推荐新增行场景)</li>
</ol>
<h2 id="代码">代码</h2>
<p>定义行主键生成逻辑,生成规则可以通过 row-config.createKeyMethod 来自定义,也可以全局定义。</p>
<pre><code class="language-html"><template>
<div>
<!-- 新增行按钮 -->
<vxe-button type="primary" @click="addEvent">新增数据</vxe-button>
<!-- vxe-table 表格 -->
<vxe-grid ref="gridRef" v-bind="gridOptions"></vxe-grid>
</div>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
// 表格行数据类型定义
interface TableRow {
id: number; // 明确指定为数字类型主键
name: string;
role?: string;
sex?: string;
age?: number;
address?: string;
}
// 表格实例引用
const gridRef = ref<InstanceType<typeof import('vxe-table')> | null>(null)
// 数字主键自增初始值(可根据业务调整)
let idSeed = 1000000000
// 表格配置项
const gridOptions = reactive({
border: true,
showOverflow: true,
keepSource: true,
height: 400,
// 核心:自定义行主键配置
rowConfig: {
keyField: 'id', // 指定 id 字段作为行唯一主键
// 自定义主键生成方法:返回数字类型,实现自增
createKeyMethod: () => idSeed++
},
// 单元格编辑配置
editConfig: {
trigger: 'click',
mode: 'cell',
showStatus: true
},
// 表格列配置
columns: [
{ type: 'seq', width: 70, title: '序号' },
{ field: 'name', title: '姓名', editRender: { name: 'input' } },
{ field: 'sex', title: '性别', editRender: { name: 'input' } },
{ field: 'age', title: '年龄', editRender: { name: 'input' } },
{ field: 'address', title: '地址', editRender: { name: 'input' } }
],
// 初始化数据(id 均为数字类型)
data: [
{ id: 10001, name: 'Test1', role: 'Develop', sex: '男', age: 28, address: 'test abc' },
{ id: 10002, name: 'Test2', role: 'Test', sex: '女', age: 22, address: '广州' },
{ id: 10003, name: 'Test3', role: 'PM', sex: '男', age: 32, address: '上海' },
{ id: 10004, name: 'Test4', role: 'Designer', sex: '女', age: 24, address: '上海' }
]
})
// 新增行事件
const addEvent = async () => {
const $grid = gridRef.value
if (!$grid) return
// 新增空数据,主键由自定义方法自动生成
const newRecord = { name: `Name_${Date.now()}` }
const { row: newRow } = await $grid.insert(newRecord)
// 验证:主键为数字类型
console.log('新增行主键类型:', typeof newRow.id, '主键值:', newRow.id)
console.log('新增行数据:', newRow)
// 自动聚焦编辑姓名单元格
$grid.setEditCell(newRow, 'name')
}
</script>
</code></pre>
<p><img src="https://img2024.cnblogs.com/blog/3765549/202604/3765549-20260417171312573-362856871.png"></p>
<h2 id="关键配置说明">关键配置说明</h2>
<h3 id="参数作用">参数 作用</h3>
<p>rowConfig.keyField 指定表格行的唯一主键字段(如 id),替代默认主键<br>
rowConfig.createKeyMethod 自定义主键生成函数,返回值即为最终主键</p>
<h3 id="全局配置推荐多页面复用">全局配置(推荐多页面复用)</h3>
<pre><code class="language-javascript">// main.ts
import { VxeUI } from 'vxe-table'
let globalIdSeed = 1000000000
VxeUI.setConfig({
table: {
rowConfig: {
keyField: 'id',
createKeyMethod: () => globalIdSeed++
}
}
})
</code></pre>
<h3 id="方案对比与选择">方案对比与选择</h3>
<ul>
<li>指定业务字段为主键
<ul>
<li>适用场景:表格数据由后端返回,自带数字 ID</li>
<li>优点:无额外逻辑,直接复用后端 ID</li>
<li id="">配置:仅需设置 rowConfig:</li>
</ul>
</li>
<li>自定义主键生成方法
<ul>
<li>适用场景:前端新增临时数据、无后端 ID 场景</li>
<li>优点:完全可控,强制生成数字类型,避免类型报错</li>
<li>配置:keyField + createKeyMethod 组合使用</li>
</ul>
</li>
</ul>
<p>github文档:<br>
https://github.com/x-extends/vxe-table<br>
https://vxetable.cn</p><br><br>
来源:https://www.cnblogs.com/zhiy3/p/19884666
頁:
[1]