论Ant Design ProTable 中如何优雅设置搜索框默认值

最近做的几个项目都需要在项目中回显数据,刚好我用的就是Ant Design 的ProTable,官方并没有很明确例子和说明如何去做,有以下几个关键点是要注意的。以下是优化后的解决方案及代码说明:

一、问题原因分析

  1. formRef 初始化问题:未正确初始化 useRef 导致引用为空
  2. 时间格式问题:直接使用字符串而非 moment 对象
  3. 执行时机问题:表单未完全初始化时设置值

优化后的解决方案

jsx 复制代码
import React, { useEffect, useRef } from 'react';
import ProTable from '@ant-design/pro-table';
import { getList } from './service';
import moment from 'moment';

const columns = [
  {
    title: '时间周期',
    dataIndex: 'created_at',
    valueType: 'dateTimeRange',
    hideInTable: true,
    search: {
      transform: (value) => ({
        start_time: value?.[0],
        end_time: value?.[1],
      }),
    },
  },
];

export default () => {
  const formRef = useRef(null); // 正确初始化 ref
  
  // 使用 moment 对象作为默认值
  const defaultTimeRange = [
    moment().startOf('month'),
    moment().endOf('month')
  ];

  useEffect(() => {
    // 添加空依赖确保只执行一次
    if (formRef.current) {
      // 先设置表单值
      formRef.current.setFieldsValue({
        created_at: defaultTimeRange,
      });
      
      // 延迟提交确保表单渲染完成
      setTimeout(() => {
        formRef.current.submit();
      }, 0);
    }
  }, []); // 空依赖数组确保只运行一次

  return (
    <ProTable
      columns={columns}
      request={getList}
      rowKey="id"
      formRef={formRef}
      search={{
        optionRender: (searchConfig, formProps, dom) => [
          <div key="submit">自定义搜索按钮</div>,
        ],
      }}
    />
  );
};

二、关键改进说明

  1. 正确初始化 ref

    jsx 复制代码
    const formRef = useRef(null);
  2. 使用 moment 对象

    jsx 复制代码
    moment().startOf('month') // 返回 moment 对象
  3. 合理的执行时机控制 • 使用 setTimeout 确保表单渲染完成

    • 空依赖的 useEffect 确保初始化逻辑只执行一次

  4. 推荐使用异步初始化

    jsx 复制代码
    useEffect(() => {
      const timer = setTimeout(() => {
        if (formRef.current) {
          formRef.current.setFieldsValue({
            created_at: defaultTimeRange,
          });
        }
      }, 100);
      
      return () => clearTimeout(timer);
    }, []);

三、其他注意事项

  1. 如果遇到表单值不更新,尝试使用 formRef.current.resetFields() 重置表单
  2. 确保服务端接口能正确处理时间范围参数
  3. 对于复杂场景,建议使用 initialValues 配合请求参数
相关推荐
excel7 小时前
🧩 深入浅出讲解:analyzeScriptBindings —— Vue 如何分析 <script> 里的变量绑定
前端
蓝瑟7 小时前
AI时代程序员如何高效提问与开发工作?
前端·ai编程
林晓lx8 小时前
使用Git钩子+ husky + lint语法检查提高前端项目代码质量
前端·git·gitlab·源代码管理
王同学要变强8 小时前
【深入学习Vue丨第二篇】构建动态Web应用的基础
前端·vue.js·学习
程序定小飞8 小时前
基于springboot的web的音乐网站开发与设计
java·前端·数据库·vue.js·spring boot·后端·spring
Hello_WOAIAI8 小时前
2.4 python装饰器在 Web 框架和测试中的实战应用
开发语言·前端·python
FinClip8 小时前
凡泰极客亮相香港金融科技周,AI助力全球企业构建超级应用
前端
阿四9 小时前
【Nextjs】为什么server action中在try/catch内写redirect操作会跳转失败?
前端·next.js
申阳9 小时前
Day 6:04. 基于Nuxt开发博客项目-LOGO生成以及ICON图标引入
前端·后端·程序员
中国lanwp9 小时前
npm中@your-company:registry 和 registry 的区别
前端·npm·node.js