You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React中Material Table表格flag字段重复数据校验实现咨询

实现方案

核心思路

直接在Material Table自带的字段校验逻辑中新增重复判断,同时可在新增、编辑行的回调里加二层校验,避免前端校验被绕过,校验时需要注意编辑场景下排除当前正在修改的行,避免把自身判定为重复。

具体修改步骤

1. 升级flag字段的validate校验

修改columns配置中flag字段的校验逻辑,新增重复判断:

const columns = [
  {
    title: "Type",
    field: 'flag', // 原代码的.trim()没必要,直接写字段名即可
    editable: 'onAdd',
    validate: rowData => {
      // 原有必填校验
      if(rowData.flag===undefined || /^ *$/.test(rowData.flag)){
        return 'Required'
      }
      // 新增重复校验
      const trimmedFlag = rowData.flag.trim()
      const isDuplicate = data.some(item => {
        // 编辑场景下排除当前行自身
        if (rowData.tableData?.id !== undefined && item.tableData.id === rowData.tableData.id) {
          return false
        }
        return item.flag?.trim() === trimmedFlag
      })
      if (isDuplicate) {
        return 'flag值不可重复'
      }
      return true
  }},
  // 剩余其他字段配置
];

2. 新增/编辑回调加二层校验(可选,安全性更高)

为了避免前端校验被绕过,建议在addRowToTable和updateTableData里也加重复判断,不符合要求就拒绝提交:

新增行校验:

const addRowToTable = (newData) => {
  setActionPerformed(true)
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const trimmedNewFlag = newData.flag.trim()
      const isDuplicate = data.some(item => item.flag?.trim() === trimmedNewFlag)
      if (isDuplicate) {
        alert('flag值不可重复,无法新增')
        reject()
        return
      }
      setData([...data, newData]);
      resolve();
    }, 300);
  })
}

编辑行校验:

因为你的flag字段配置了editable: 'onAdd'仅新增可编辑,编辑场景下不可修改flag,这部分可以不加,如果后续修改了可编辑权限建议加上:

const updateTableData = (newData, oldData) => {
  newData.shopId = selectedShop.value
  setActionPerformed(true)
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const trimmedNewFlag = newData.flag.trim()
      const isDuplicate = data.some(item => {
        // 排除当前编辑的行
        if (item.tableData.id === oldData.tableData.id) return false
        return item.flag?.trim() === trimmedNewFlag
      })
      if (isDuplicate) {
        alert('flag值不可重复,无法修改')
        reject()
        return
      }
      const dataUpdate = [...data];
      const index = oldData.tableData.id;
      dataUpdate[index] = newData;
      setData([...dataUpdate]);
      resolve();
    }, 300)
  })
}

补充说明

如果需要忽略flag的大小写差异,把对比逻辑改成item.flag?.trim().toLowerCase() === trimmedFlag.toLowerCase()即可。

内容的提问来源于stack exchange,提问作者Nausheen Khan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 18:06:03