首页 > 其他分享 >React使用ProComponent建立表单和列表

React使用ProComponent建立表单和列表

时间:2024-07-13 13:51:34浏览次数:15  
标签:ProComponent 表单 React record 组件 列表 true columns

ProComponent

ProComponent基于Antd组件库,进一步封装,成为满足企业级开发需求的组件库。其兼容Antd内容的基础上,对表单列表等内容进行完善,在建立表单等需求中能够提供强大的api以及功能集合

Ant Design 定义了基础的设计规范,对应也提供了大量的基础组件。但是对于中后台类应用,我们希望提供更高程度的抽象,提供更上层的设计规范,并且提供相应的组件使得开发者可以快速搭建出高质量的页面。

在 ProComponents 中我们内置了一系列的设计规范,预设了常用的逻辑。在这个基础上我们同样提供了灵活的支持,比如对于 ProTable 来说你也可以把它完全当做 Ant Design 的 Table 来用,对于 ProForm 来说你也可以直接使用 Ant Design 的基础组件或者你的自定义组件。

 

使用ProTable建立列表

ProTable通过传入columns对象数组,遍历节点进行组件组合,无需通过模版进行表单组件组合,极大减少代码长度,便于管理

构建columns

//columns数组构建
//通过使用useMemo,创建缓存数据,避免造成重新渲染
const columns: ProFormColumnsType[] = useMemo(
  () => [
    createTableColumnIndex() as any,
    {
      title: '广告名称',
      dataIndex: 'advertName',
      formItemProps: {
        rules: [{ required: true }],
      },
    },
    {
      title: '广告描述',
      dataIndex: 'advertDescribe',
    },
    {
      title: '排序',
      dataIndex: 'sort',
      hideInSearch: true,
      valueType: 'digit',
      formItemProps: { min: 0 },
    },
    {
      title: '发布状态',
      dataIndex: 'state',
      hideInForm: true,
      valueEnum: {
        0: {
          text: '未发布',
          status: 'default',
        },
        1: {
          text: '已发布',
          status: 'success',
        },
      },
    },
    {
      title: '操作',
      dataIndex: 'btn',
      hideInForm: true,
      hideInSearch: true,
      render: (_: any, record: any) => (
        <Space split={<Divider type="vertical" style={{ margin: 0 }} />}>
          <a>发布</a>
          <a onClick={() => editorRef.current?.show(record)}>编辑</a>
          <a>详情</a>
          <Popconfirm
            title={'是否删除'}
            onConfirm={() => onRemove(record.id)}
          >
            <a style={{ color: 'red' }}>删除</a>
          </Popconfirm>
        </Space>
      ),
    },
  ],
  [],
);

举例一个列表页,columns每一个对象为一竖列

title 表头 dataIndex 对应值字段名

通过设置hideInForm hideInTabel hideInSearch,控制当前列是否在表单中,列表中和查询中显示

render属性能够改变元素在行中的展示,通过返回相应的节点

构建列表

<PageContainer>
  <ProTable
    rowKey={'id'}
    columns={columns as any}
    request={getTableRequest}
    actionRef={actionRef}
    toolbar={{
      menu: {
        type: 'tab',
        activeKey: activeKey,
        items: [
          {
            key: 'tab1',
            label: <span>门户</span>,
          },
          {
            key: 'tab2',
            label: <span>小程序</span>,
          },
        ],
        onChange: (key) => {
          setActiveKey(key as string);
        },
      },
      actions: [
        <Button
          key="add"
          type="primary"
          icon={<PlusOutlined />}
          onClick={() => editorRef.current?.show()}
        >
          新增
        </Button>,
      ],
    }}
  />
</PageContainer>

rowId 每一列设定一个唯一id进行辨识 

columns 传入定义的columns数组

request 传入请求数据返回的promise,此处需要进行数据构建,大概为{content:[],total:100,msg:'***'},具体看文档

actionRef 传入创建的ref节点,用来控制列表的渲染相关内容const actionRef = useRef<ActionType>()

toolbar 用来定义工具栏,能够构建不同的内容。此处构建了一个按钮和tab切换

 

表单构建

将表单作为子组件,通过父组件(列表页)控制表单页ref属性,进行表单页的展示与隐藏

export const Index: React.ForwardRefExoticComponent<
  Props & React.RefAttributes<ModalRefObject>
> = forwardRef((props, ref) => {
  const formRef = useRef<ProFormInstance>();
  const [visible, setVisible] = useState<boolean>();
  const [record, setRecord] = useState<any>();

  useImperativeHandle(ref, () => ({
    show: (values: any) => {
      setRecord(values);
      setVisible(true);
    },
  }));

  useEffect(() => {
    if (visible) {
      formRef.current?.resetFields();
      formRef.current?.setFieldsValue(record);
    }
  }, [visible, record]);

  return (
    <>
      ***
    </>
  );
});
  • 子组件利用React.forwardRef()构建组件hook,接受父组件传入的ref对象,
  • 通过useImperativeHandle()设置ref相应方法
  • 定义visible 和 record 状态记录表单展示和表单数据

 

如果是平常的表单,可以通过<BetaSchemaForm/>进行构建,其columns与ProTable相同,通过每个对象创建表单项

<BetaSchemaForm
  width={600}
  columns={columns as any}
  formRef={formRef}
  layout={'horizontal'}
  layoutType={'ModalForm'}
  labelCol={{ flex: '80px' }}
  open={visible}
  onOpenChange={setVisible}
  title={'表单'}
  onFinish={onSave}
  modalProps={{
    centered: true,
    styles: {
      body: { paddingTop: 30 },
    },
  }}
/>

如果表单复杂,可以通过<ProForm/>既相应ProForm项组件进行构建

<ModalForm
  width={600}
  formRef={formRef}
  layout={'horizontal'}
  labelCol={{ flex: '80px' }}
  open={visible}
  onOpenChange={setVisible}
  title={record ? '编辑广告' : '新增广告'}
  onFinish={onSave}
  modalProps={{
    centered: true,
    styles: {
      body: { paddingTop: 30 },
    },
  }}
>
  <ProFormText
    name="advertName"
    label="广告名称"
    placeholder="请填写"
    rules={[{ required: true }]}
  />
  <ProFormUploadButton
    label="视频文件"
    name="file"
    title=""
    listType="picture-card"
    icon={<PlusOutlined />}
    required={true}
    fileList={fileList}
    fieldProps={{
      multiple: true,
      onRemove: onVideoRemove,
      customRequest: uploadFile,
    }}
  />

  <ProFormText
    name="advertDescribe"
    label="广告描述"
    placeholder="请填写"
  />
  <ProFormText
    name="sort"
    label="排序"
    placeholder="请填写"
    fieldProps={{ style: { width: 150 } }}
  />
</ModalForm>

 

标签:ProComponent,表单,React,record,组件,列表,true,columns
From: https://www.cnblogs.com/karle/p/18299996

相关文章

  • vue中ref()与reactive(的区别)
    #ref和reactive的区别对比之前先看一下如何使用,它们的使用方法都很简单,也很类似:<template> <div>{{user.first_name}}{{user.last_name}}</div> <div>{{age}}</div></template><script>import{reactive}from'vue'exportdefa......
  • React中使用usePrevious的意义是什么,为啥要用它
    usePrevious钩子exportfunctionusePrevious<T>(value:T):T|undefined{constref=useRef<T>();useEffect(()=>{ref.current=value;},[value]);returnref.current;}注:更多好用的性能钩子网站推荐:https://react-hooks-library.vercel.ap......
  • 日常工作中需要避免的9个React坏习惯
    前言React是前端开发领域中最受欢迎的JavaScript库之一,但有时候在编写React应用程序时,可能陷入一些不佳的习惯和错误做法。这些不佳的习惯可能导致性能下降、代码难以维护,以及其他问题。在本文中,我们将探讨日常工作中应该避免的9个坏React习惯,并提供相关示例代码来说明这些问题以......
  • 日常工作中需要避免的9个React坏习惯
    前言React是前端开发领域中最受欢迎的JavaScript库之一,但有时候在编写React应用程序时,可能陷入一些不佳的习惯和错误做法。这些不佳的习惯可能导致性能下降、代码难以维护,以及其他问题。在本文中,我们将探讨日常工作中应该避免的9个坏React习惯,并提供相关示例代码来说明这些......
  • react 实现前端发版监测
    先说下前端发版流程1.前端打包输出产物/dist文件2.删除远程服务下打包的旧代码3.将打包参物/dist文件copy到远程服务器目录4.重启服务器问题1在步骤2,3,4中用户访问目标服务器会报JS错误,正常情况打开网页的控制面板会看下报错信息`Failedtofetchdynamicallyimp......
  • 推荐几个开源的vue表单设计器
    1、Form.ioForm.io是一个开源的纯JavaScript表单渲染器和API平台,为开发者提供了一种快速、灵活的方式来构建和管理表单驱动的应用程序。Form.io使用ES6和JavaScript实现(没有jQuery、Angular、React或任何其他框架依赖),将JSON模式渲染为webform表单,并将该表单挂接到Form.io服务......
  • 适用于react、vue菜单格式化工具函数
    场景在一个动态菜单场景中,你向接口获取树形菜单,但最后拿到的树未能达到你的预期,这个时候就需要手写递归重新处理这颗树适用于react、vue菜单格式化工具函数包含功能1.当前路由是否存在返回按钮判断逻辑:只要存在左侧可点击的菜单都不具备返回按钮,其他则具有返回按钮2.错误......
  • 图标组件的封装与管理(React/svg)
    一概要1.1背景最近在项目中使用了很多从iconfont拿到的图标。使用官网的导入方法有些繁琐,也不易管理。于是捣鼓了一下...1.2目的能够像组件一样使用,具有规范性。比如暴露一个type属性,根据不同的type使用不同的主题色。高自由度。可以直接在项目中管理图标,只需要处理从其......
  • Contact Form联系表单自动发送邮件(超级简单)
    前几天发现了aoksend推出的这个联系表单的组件,非常好用,只有一个php文件,把php文件放到网站主目录里面。然后去aoksend注册和配置好域名和发信邮箱,可以得到发送密钥:app_key,然后配置好邮件模板,可以得到邮件id:template_id。将这两个数据配置到上面那个php文件里面第31行的位置。$d......
  • 界面组件Kendo UI for React 2024 Q2亮点 - 生成式AI集成、设计系统增强
    随着最新的2024年第二季度发布,KendoUIforReact为应用程序开发设定了标准,包括生成式AI集成、增强的设计系统功能和可访问的数据可视化。新的2024年第二季度版本为应用程序界面提供了人工智能(AI)提示,从设计到代码的生产力增强、可访问性改进、一系列新的UI组件等。KendoUI致力......