ProComponent 用法学习

news2024/9/23 23:22:06

相信很多同学都用过 Ant Design 这一 react 著名组件库,ProComponents 则是在 antd 之上进行封装的页面级组件库(指一个组件就可以搞定一个页面)。它同时也是 Ant Design Pro 中后台框架所用的主要组件库。如果你手上有要用 react 开发的中后台新项目又人手不够的话,我强烈推荐你体验一下这个库。可以极大的减少日常 CRUD 的代码量并统一风格。

在 ProComponent 中,最为核心的就是 ProForm(表单)和 ProTable(表格)两个组件,面对数量繁多的配置项,很多人都会在文档中迷失自我,本文就来总结了一些常见的配置。

ProTable

ProTable 最大的好处就是它集成了表格的查询条件和分页配置。只需要配置表格列就可以自动生成对应的查询 form。除此之外它提供的插槽和细节小功能用起来也十分舒服。

1、基础流程

先来简单介绍一下基本的使用,主要就是两部分:表格列配置、查询请求,最后把他俩塞给 ProTable 就完事了:

import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { ProTable, ModalForm } from '@ant-design/pro-components';
import React, { useRef, useState } from 'react';

type GithubIssueItem = {};

export default () => {
  const actionRef = useRef<ActionType>();

  const columns: ProColumns<GithubIssueItem>[] = [
    {
      title: '审批单号',
      key: 'showTime',
      dataIndex: 'showTime',
      valueType: 'text',
    },
    {
      title: '任务状态',
      key: 'showTime3',
      dataIndex: 'showTime3',
      valueType: 'select',
      valueEnum: {
        open: {
          text: '审核中',
          status: 'Error',
        },
        closed: {
          text: '已完成',
          status: 'Success',
        },
        processing: {
          text: '已作废',
          status: 'Processing',
        },
        submited: {
          text: '待提交',
          status: 'Processing',
        },
      },
    },
    {
      title: '时间',
      key: 'showTime5',
      dataIndex: 'showTime5',
      valueType: 'date',
    },
    {
      title: '资料大类',
      key: 'showTime9',
      dataIndex: 'showTime9',
      valueType: 'select',
      fieldProps: { mode: 'multiple' },//多选
      valueEnum: {
        pages: {
          text: '页面',
          status: 'pages',
        },
        Copywriting: {
          text: '文案',
          status: 'Copywriting',
        },
      },
    },
    {
      title: '操作',
      valueType: 'option',
      key: 'option',
      render: (text, record, _, action) => [<a>详情</a>],
    },
  ];
  //获取table数据
  const getTableData = async (param: any) => {
    const params = {
      ...param,
    };
    // const { data, success } = await fetchCompanyList(params);
    return {
      data: [{}],
      success: true,
      page: 1,
      total: 0,
    };
  };
  return (
    <>
      <ProTable<GithubIssueItem>
        columns={columns}
        actionRef={actionRef}
        request={getTableData}
        headerTitle="结果查询"
        search={{ labelWidth: 'auto' }}
        />
      </>
      );
    };

然后你就得到了这个简单但五脏俱全的表格:

在 ProTable 中查询条件和表格列是一一对应的,通过columns来配置,也就是说每个列都会生成一个对应的查询条件,注意列配置中的 valueType 字段,不同的值可以让输入框变成日期、下拉、多选、进度条等等详细点击这里查看,然后 ProTable 就会按照对应的格式渲染表格字段和查询表单项

在发起查询时,你所有的查询条件和分页参数都会被传递给 request 参数对应的函数上,最后把查询到的结果按照给定的格式返回出去即可,注意这个函数可以是异步函数,ProTable 会根据这个函数的状态自动渲染相关的加载动画,非常舒服。

同时所有 antd Table Column 支持的配置项都可以用在这里

2、隐藏查询条件

ProTable 默认会显示所有列的查询条件,如果你想隐藏指定列的查询条件,可以在列配置项里添加 hideInSearch:

const columns = [
  {
    title: '审批单号',
    key: 'showTime',
    dataIndex: 'showTime',
    valueType: 'text',
    hideInSearch: true, //隐藏查询条件
  },
];

或者如果想直接隐藏整个查询表单的话,可以在 ProTable 上关闭 search 项:

<ProTable
  search={false}// 不显示搜索表单
  columns={columns}
  request={getData}
  rowKey="id"
/>

3、查询默认值

你可以通过列表项的 initialValue 来给查询表单项设置默认值:

const columns = [
  {
    title: '申请日期',
    dataIndex: 'applyDate',
    valueType: 'date',
    align: 'center',
    initialValue: '2021-7-1',// 设置默认值
  },
  // ...
];

4、列宽调整

ProTable 默认会等分所有列,想调整指定列宽的话可以修改列配置的 width 属性,支持百分比和数字。

// 表格行配置项
const columns = [
  {
    title: '企业名称',
    dataIndex: 'corName',
    width: '70%',    // 设置为百分比
  },
  {
    title: '申请日期',
    dataIndex: 'applyDate',
    valueType: 'date',
    width: 240,    // 设置为固定值
  }
];

5、查询条件顺序调整

ProTable 默认按照列配置的索引排列查询条件,你可以通过指定列配置项中的 order 来调整查询条件的顺序,其值越大就越靠前:

const columns = [
  {
      title: '审批单号',
      key: 'showTime',
      dataIndex: 'showTime',
      valueType: 'text',
      order: 9,
    },
    {
      title: '任务状态',
      key: 'showTime3',
      dataIndex: 'showTime3',
      valueType: 'select',
      order: 10,
      valueEnum: {
        open: {
          text: '审核中',
          status: 'Error',
        },
        closed: {
          text: '已完成',
          status: 'Success',
        },
        processing: {
          text: '已作废',
          status: 'Processing',
        },
        submited: {
          text: '待提交',
          status: 'Processing',
        },
      },
    },
];

6、查询条件长度调整

你可以通过指定列配置的 colSize 项来调整具体查询条件的长度,官方介绍如下:

默认情况下一个 colSize 的长度就是 8 span,那么也就是说 colSize: 4 时就可以占满一行:

const columns = [
  {
    title: '审批单号',
    key: 'showTime',
    dataIndex: 'showTime',
    valueType: 'text',
    colSize: 4,
    order: 9,
  },
  //...
];

注意这个值没必要是整数,你可以设置为 0.5 来将其缩短,但是要注意最后相乘得到的 span 值最好是个整数。

7、时间查询条件改为范围

默认的 valueType: 'date' 只会显示单个日期选择器,所以我们需要使用其他方法来实现这个需求,具体做法也很简单,把表格列的查询项关掉,然后放置一个时间范围的查询条件,注意时间范围使用 hideInTable 参数让它不会显示在表格里:

// 表格行配置项
const columns = [
    {
        title: '申请日期',
        dataIndex: 'applyDate',
        valueType: 'date',
        hideInSearch: true
    },
    {
        title: '申请日期',
        dataIndex: 'applyDateRange',
        valueType: 'dateRange',
        fieldProps: { placeholder: ['开始时间', '结束时间'] },
        hideInTable: true
    },
];

然后你就可以在 request 里处理他们:

const getData = async (params) => {
  const query = {
    ...params,
    applyDateStart: (params.applyDateRange || [])[0],
    applyDateEnd: (params.applyDateRange || [])[1]
  };
  delete query.applyDateRange;

  // 发起请求 ...
};

ProForm

ProForm 的好处是封装了不同的表单外观,你只需要切换一个字段就可以把页面表单切换成弹出表单或者抽屉表单。除此之外还封装了提交和重置行为、以及对常用的表单项都进行了封装。

1、基础流程

ProTable 的用法更加简单,在 ProForm 标签里插入封装好的 表单项。然后给 onFinish 设置一个函数即可,这个函数会接受到 通过校验 的表单项,然后你就可以在这里访问后端进行提交了。

import ProForm, {
  ProFormRadio,
  ProFormText,
  ProFormDatePicker,
} from '@ant-design/pro-form';

const PolicyDetail = (props) => {
  // 只有通过校验之后才会触发这个方法
  const onSubmit = async (values) => {
    console.log(values);
  };

  return (
    <ProForm onFinish={onSubmit}>
      <ProFormText
        name="name"
        label="名称"
        placeholder="请输入名称"
        />
      <ProFormRadio.Group
        name="status"
        label="状态"
        options={[
          { label: '已生效', value: '已生效' },
          { label: '已作废', value: '已作废' }
        ]}
        rules={[{ required: true, message: '状态不能为空' }]}
        />
      <ProFormDatePicker
        name="publishTime"
        label="时间"
        placeholder="请选择时间"
        rules={[{ required: true, message: '时间不能为空' }]}
        />
    </ProForm>
  );
};

注意,在 ProForm 中,select, checkbox, radio, radioButton 这些表单项都支持通过 options 参数配置选项内容,其值为 { value: '', label: ''} 格式的数组。具体介绍可以看 这里。

注意,所有的 ProForm 表单组件都是用 Form.Item + 对应的组件封装的来的,都支持使用 fieldProps 属性来支持设置输入组件的 props。

也就是说,fieldProps 参数里的属性都会被透传给内部的输入组件,而直接设置给 ProForm 表单组件的字段会被透传给 Form.Item。切记切记,不要一看到表单项列表里一点属性都没贴就觉得这玩意没法用了。

2、对齐提交按钮

大多数表单开发的习惯都是底部的操作按钮组和字段输入框对齐,但如果你给 form 配置了 layout="horizontal" 和 labelCol={{ span: 4 }} 后就会发现,底部的按钮组还是左侧开始的。

解决这个对齐问题需要用到 ProForm 的 submitter 属性,而其中的 render 函数则可以控制底部按钮组的渲染,这个函数的第二个入参是一个数组,其元素分别是已经渲染好的重置和提交按钮,如果你有需要的话也可以在这里进行更复杂的自定义行为:

<ProForm
    submitter={{
        render: (_, dom) => (
            <Form.Item wrapperCol={{ offset: 4 }}>
                <Space>{dom}</Space>
            </Form.Item>
        ),
    }}
    // ...
>
    {/* ... */}
</ProForm>

注意我上面 wrapperCol 的 offset 是 4,你需要根据你的 ProForm 配置自行调整。

3、数据回填

想回填数据的话需要用到 ProForm 的 initialValues,整个表单的数据都应该在这里设置。注意在数据获取到之前不能渲染表单,不然初始值就无效了。

import React, { useState, useEffect } from 'react';
import ProForm from '@ant-design/pro-form';
import { Skeleton } from 'antd';
import { isEmpty } from 'lodash';
import { getDetail } from '@/service';

const Detail = () => {
    // 详情数据
    const [detail, setDetail] = useState({});

    // 获取详情
    useEffect(async () => {
        const { data } = await getDetail();
        setDetail(data);
    }, []);

    const loadingPage = isEmpty(detail);
    
    // 数据获取到之前展示加载动画,让 form 渲染时肯定可以得到初始值
    return loadingPage ? (
        <Skeleton active />
    ) : (
        <ProForm initialValues={detail}>
            {/* ... */}
        </ProForm>
    )
};

我注意到有很多人在回填表单数据的时候喜欢用 form.setFieldsValue 设置,但是这么做是不对的,一方面在数据抵达的时候 form 表单项可能还没加载出来,另一方面使用 initialValues 可以让重置按钮可以恢复到初始值,而不是重置成全空表单。

4、表单项联动

表单里经常会出现如下这种表单项联动的需求:

ProComponent 中提供了 ProFormDependency 组件可以响应式的处理这种需求:

import ProForm, { ProFormRadio, ProFormDependency } from '@ant-design/pro-form';

<ProFormRadio.Group
    name="status"
    label="结论"
    options={[
        { label: '审核通过', value: 1 },
        { label: '审核不通过', value: 2 }
    ]}
/>

<ProFormDependency name={['status']}>
    {({ status }) => {
        if (!status || status === 1) return null;
        return (<ProFormTextArea
            name="refuseReason"
            label="驳回原因"
            placeholder="请填写驳回原因"
        />);
    }}
</ProFormDependency>

ProFormDependency 在 name 字段里绑定的值变更后会自动触发 children 里的函数进行渲染。

欧窝

更多用法自己探索

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/854877.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pytorch深度学习-----现有网络模型的使用及修改(VGG16模型)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

photoshop PS 查看像素坐标、像素颜色、像素HSB颜色

方法一 photoshop 菜单栏 窗口菜单->信息菜单项(F8), 在信息窗口里会有当前的 x&#xff0c;y坐标 方法二 photoshop 菜单栏 视图菜单->标尺菜单项&#xff08;ctrlR&#xff09; 宽度和高度边上都有标尺&#xff0c;默认的是厘米&#xff0c;右键单机宽度和高度边上…

【自动化测试框架】关于unitttest你需要知道的事

一、UnitTest单元测试框架提供了那些功能 1.提供用例组织和执行 如何定义一条“测试用例”? 如何灵活地控制这些“测试用例”的执行? 2.提供丰定的断言方法 当测试用例的执行结果与预期结果不一致时&#xff0c;判定测试用例失败。在自动化测试中&#xff0c;通过“断言”…

【IMX6ULL驱动开发学习】04.应用程序和驱动程序数据传输和交互的4种方式:非阻塞、阻塞、POLL、异步通知

一、数据传输 1.1 APP和驱动 APP和驱动之间的数据访问是不能通过直接访问对方的内存地址来操作的&#xff0c;这里涉及Linux系统中的MMU&#xff08;内存管理单元&#xff09;。在驱动程序中通过这两个函数来获得APP和传给APP数据&#xff1a; copy_to_usercopy_from_user …

MySQL之深入InnoDB存储引擎——Undo页

文章目录 一、UNDO日志格式1、INSERT操作对应的UNDO日志2、DELETE操作对应的undo日志3、UPDATE操作对应的undo日志1&#xff09;不更新主键2&#xff09;更新主键的操作 3、增删改操作对二级索引的影响 二、UNDO页三、UNDO页面链表四、undo日志具体写入过程五、回滚段1、回滚段…

Java课题笔记~ Servlet编程

1.Servlet编程基础 (1)什么是Servlet Servlet是基于Java语言的Web编程技术&#xff0c;部署在服务器端的Web容器里&#xff0c;获取客户端的访问请求&#xff0c;并根据请求生成响应信息返回给客户端。 创建Servlet的方式&#xff0c;有 如下图&#xff1a;一般创建Servlet都…

Vue3 表单输入绑定简单应用

去官网学习→表单输入绑定 | Vue.js 运行示例&#xff1a; 代码&#xff1a;HelloWorld.vue <template><div class"hello"><h1>Vue 表单输入绑定</h1><input type"text" placeholder"输入框" v-model"msg"…

Open_PN笔记

>>>仅用作学习用途 1.准备好需要用到的工具 官网下载地址&#xff1a; openvpn 客户端下载地址&#xff1a; https://swupdate.openvpn.org/community/releases/openvpn-install-2.4.5-I601.exe EasyRSA下载地址&#xff1a; https://githu…

4、Rocketmq之存储原理

CommitLog ~ MappedFileQueue ~ MappedFile集合

web-初始前端

不区分大小写&#xff0c;单双引号&#xff0c; <html><head><title>初识HTML</title></head><body><h1>Hello world!</h1><img src OIF-C.jfif/></body> </html> <!-- 文件格式 --> <!DOCTYPE h…

PoseFormer:基于视频的2D-to-3D单人姿态估计

3D Human Pose Estimation with Spatial and Temporal Transformers论文解析 摘要1. 简介2. Related Works2.1 2D-to-3D Lifting HPE2.2 GNNs in 3D HPE2.3 Vision Transformers 3. Method3.1 Temporal Transformer Baseline3.2 PoseFormer: Spatial-Temporal TransformerSpati…

人文景区有必要做VR云游吗?如何满足游客出行需求?

VR云游在旅游行业中的应用正在快速增长&#xff0c;为游客带来沉浸式体验的同时&#xff0c;也为文旅景区提供了新的营销方式。很多人说VR全景展示是虚假的&#xff0c;比不上真实的景区触感&#xff0c;人文景区真的有必要做VR云游吗&#xff1f;我的答案是很有必要。 如果你认…

【vue3+pinia+Cookie】实现token登录及数据持久化

vue2后台登录项目,目前接触到的基本上都是vuex+本地存储或vuex+cookie或vuex+专门用于持久化vuex的库,如:vuex-persistedstate vuex默认情况下是在客户端内存中保存应用程序的状态,当页面刷新的时候,内存中的数据会丢失,导致vuex中的数据也会丢失。因为vuex的状态存储是临…

linux-删除KVM虚拟机

1.查看主机 #virsh list 2.关闭主机 #virsh shutdown 虚拟机名称 3.删除主机定义 #virsh undefine 虚拟机名称 4.删除KVM虚拟机文件 #find / -name 虚拟机名称 #rm -rf 虚拟机文件

Windows11安装Linux子系统,并实现服务自启动,局域网访问,磁盘挂载

Windows11安装Linux子系统&#xff0c;并实现服务自启动&#xff0c;局域网访问&#xff0c;磁盘挂载 一、准备工作二、安装Linux子系统(wsl2)三、为Linux子系统设置桥接网络检查wsl版本在 Hyper-V 管理器中创建虚拟交换机创建 WSL 配置文件启动wsl 四、设置Windows开机自启动L…

【考研复习】24王道数据结构课后习题代码|第3章栈与队列

文章目录 3.1 栈3.2 队列3.3 栈和队列的应用 3.1 栈 int symmetry(linklist L,int n){char s[n/2];lnode *pL->next;int i;for(i0;i<n/2;i){s[i]p->data;pp->next;}i--;if(n%21) pp->next;while(p&&s[i]p->data){i--;pp->next;}if(i-1) return 1;…

openssl安装问题合辑

1.openssl拖累nginx编译失败 问题描述&#xff1a; 因为漏洞原因&#xff0c;升级openssl之后需要重新编译nginx&#xff0c;进行了以下步骤&#xff1a; config没问题&#xff0c;但是make一直报错 初步判断是openssl安装有问题&#xff0c;原因不明&#xff0c;重装了opens…

【ARM Cache 系列文章 9 -- ARM big.LITTLE技术】

文章目录 big.LITTLE 技术背景big.LITTLE 技术详解big.LITTLE 硬件要求 big.LITTLE 软件模型CPU MigrationGlobal Task SchedulingGlobal Task Scheduling比CPU Migration的优势 转自&#xff1a;https://zhuanlan.zhihu.com/p/630981648 如有侵权&#xff0c;请联系删除 big.L…

Codeforces Round 889 (Div. 2)C题题解

文章目录 [Dual (Hard Version)](https://codeforces.com/contest/1855/problem/C2)问题建模问题分析1.按元素值分类讨论&#xff0c;正负不同时存在时2.若正负同时存在时代码 Dual (Hard Version) 问题建模 给定n个数&#xff0c;n不超过20&#xff0c;且每个数ai&#xff0c…

MachineLearningWu_14/P65-P69_Multiclass

x.1 Multiclass多分类问题 对于分类问题&#xff0c;往往指的是二分类问题&#xff0c;而对于二分类的decision boundary较为简单&#xff0c;而实际生活中会有很多问题是多分类问题&#xff0c;例如MNIST手写数字识别&#xff0c; 从特征空间上来看&#xff0c;二分类和多分类…