react中ProTable

import {  PageContainer, ProColumns, ProTable,ProForm ,  ProFormText,} from '@ant-design/pro-components';
import { Button,Switch ,Modal, Checkbox, Form, Input} from 'antd';
import {useRef,useState} from 'react'
import type { ProFormInstance } from '@ant-design/pro-components';
import { getUserList} from '@/services/system/user';
const HomePage: React.FC = () => {
  
  type FieldType = {
    nickName?: string;
    userName?: string;
    remember?: string;
  };
  //创建一个弹框
  const [ModalShow, setModalShow] = useState(false)
    //创建一个表单实例,可以使用表单的方法
    const [form1] = Form.useForm();
  const formTableRef = useRef();
  const columns: ProColumns[] = [

    {
     title: '名字1',                            //表头显示的名称
     dataIndex: 'nickName',                    // 后端字段,列数据在数据项中对应的路径,支持通过数组查询嵌套路径
    //  width: '20%',
    //  filters: [                            // 表头的筛选菜单项
    //     { text: '男', value: '男' },
    //     { text: '女', value: '女' },
    //    ],
    valueType: 'text',
    //  hideInSearch : true,               // 设置搜索栏是否显示 true为隐藏 false为显示
    //  hideInTable : true,                // 设置表格中是否显示  true为隐藏 false为显示
    //  valueEnum: {                          //搜索栏当前列值的枚举
    //    false: { text: '禁用', status: 'Error' },     //false是后台传的值,text是页面显示的,status是antd提供的状态,具体看api
    //    true: { text: '启用', status: 'Success' },
    //  },
    render:(_,record)=>{
      return (
        record.nickName + record.remark

      )
    }
},
{
  title: '名字',                            //表头显示的名称
  dataIndex: 'userName',                    // 后端字段,列数据在数据项中对应的路径,支持通过数组查询嵌套路径
  // width: '20%',
  // hideInSearch : true,               // 设置搜索栏是否显示 true为隐藏 false为显示
  // hideInTable : true,                // 设置表格中是否显示  true为隐藏 false为显示
  valueType: 'text',
},
{
  title:'性别',
  dataIndex: 'sex',
  render:(_,r) =>{
    return (
      <span>{r.sex == 1 ? '男' : '女'}</span>
    )
  }
},
{
  title: '操作',                            //表头显示的名称
  dataIndex: 'option',                    // 后端字段,列数据在数据项中对应的路径,支持通过数组查询嵌套路径
  // width: '20%',
  // hideInSearch : true,               // 设置搜索栏是否显示 true为隐藏 false为显示
  // hideInTable : true,                // 设置表格中是否显示  true为隐藏 false为显示
  valueType: 'option',
  render:(_,r) =>[
    <Button
          type="link"
          size="small"
          key="edit"
          onClick={()=>{edit(r)}}
        >
          编辑
        </Button>
  ]
},
];
const add = () =>{
  console.log('555')
  setModalShow(true)
}
const edit = (r) =>{
  setModalShow(true)
console.log(r,'r')
// 回显数据
form1.setFieldsValue({
  nickName: r.nickName,
  userName: r.userName,
})

}
const onFinish = (value) =>{
  console.log(value,'value')
}
const onFinishFailed = (error) =>{
  console.log(error,'error')
}
const handleOk = () => {
  // form1.submit();
};
// const onFinish: FormProps<FieldType>['onFinish'] = (values) => {
//   console.log('Success:', values);
// };

// const onFinishFailed: FormProps<FieldType>['onFinishFailed'] = (errorInfo) => {
//   console.log('Failed:', errorInfo);
// };
const defaultData = [{nickName:'男',userName:'张三',userId:'111'},{nickName:'男',userName:'张三',userId:'222'}]
   const actionRef = useRef();
   return (<PageContainer>
         	 {/* //布局标签 */}
            <ProTable   
            rowKey="userId"               //表格行 key 的取值,可以是字符串或一个函数
            key="userList"
            formRef={formTableRef}
            defaultData= {defaultData}                      //表格Pro组件
            headerTitle="查询表格"            //表头
            actionRef={actionRef}            //用于触发刷新操作等
                   
            toolBarRender={() => [           //位于表格上方的操作,如“导入/导出/新增”
               <Button type="primary" key="add" onClick={()=>{add()}}>
                   新建
               </Button>,
               
              ]}
              request={(params) =>
                getUserList(params).then((res) => {
                  const result = {
                    data: res.rows,
                    total: res.total,
                    success: true,
                  };
                  console.log(result,'result')
                  return result;
                })
              }
            columns={columns}  //上面定义的
           />
           <Modal
        title="Title"
        open={ModalShow}
       
      >
        <p>我是对话框</p>
        <ProForm
        form={form1}
    labelCol={{ span: 8 }}
    wrapperCol={{ span: 16 }}
    style={{ maxWidth: 600 }}
    submitter={false}
    // initialValues={{ remember: true }}
    onFinish={onFinish}
    autoComplete="off"
  //   submitter={{
  //     render: (props, doms) => {
  //     return [
  //       ...doms,
  //       <Button htmlType="button" onClick={onFill} key="edit">
  //             一键填写
  //           </Button>
  //     ];
  //   },
  // }}
    // onOk={handleOk}
  >
<ProFormText
          name="nickName"
          label='用户昵称'
          placeholder="请输入用户昵称"
          colProps={{ xs: 24, md: 12, xl: 12 }}
          rules={[
            {
              required: true,
              // message: (
              //   <FormattedMessage id="请输入用户昵称!" defaultMessage="请输入用户昵称!" />
              // ),
            },
          ]}
        />

<ProFormText
          name="userName"
          label='用户账号'
          placeholder="请输入用户账号"
          rules={[
            {
              required: true,
            },
          ]}
        />
  </ProForm>
      </Modal>
           </PageContainer>
   )

};
export default HomePage;
import { EllipsisOutlined, PlusOutlined } from '@ant-design/icons';
import type { ActionType, ProColumns } from '@ant-design/pro-components';
import { ProTable, TableDropdown ,ModalForm,
  ProForm,
  ProFormDateRangePicker,
  ProFormSelect,
  ProFormText,} from '@ant-design/pro-components';
  import { ExclamationCircleFilled } from '@ant-design/icons';
import { Button, Dropdown, Space, Tag,Modal, Form, message ,Input, Radio , Image ,Popconfirm, Alert, Flex, Spin, Switch} from 'antd';
import type { PopconfirmProps } from 'antd';
import React,{ useRef ,useEffect,useState} from 'react';
import {UserList,Emit,AddList,DeleteList,EmitsteList} from '@/services/demo/UserController';
export const waitTimePromise = async (time: number = 100) => {
  return new Promise((resolve) => {
    setTimeout(() => {
      resolve(true);
    }, time);
  });
};

export const waitTime = async (time: number = 100) => {
  await waitTimePromise(time);
};

type GithubIssueItem = {
  url: string;
  id: number;
  number: number;
  title: string;
  labels: {
    name: string;
    color: string;
  }[];
  state: string;
  comments: number;
  created_at: string;
  updated_at: string;
  closed_at?: string;
};

interface Values {
  title?: string;
  content?: string;
  channel_id?: string;
}

const CustomerList: React.FC = () => {
  const [open,setopen] = useState(false)
  const [form] = Form.useForm();
  const [Modeltitle,setModeltitle] = useState('新建数据')
  const [dangqianlist,setdangqianlist] = useState({})
  const { confirm } = Modal;
  const [loading, setLoading] = React.useState<boolean>(false);
  // const [formValues, setFormValues] = useState<Values>();
  //定义变量接收当前人的信息
  const [emItuser, setemItuser] = useState({});
  const actionRef = useRef<ActionType>();
  // 点击提交按钮
  const onCreate = async(values: Values) => {
    if(dangqianlist?.id){
      const obj = {...dangqianlist,...values}
   const res  = await EmitsteList(obj)
   message.success('修改成功');
   setopen(false);
   actionRef.current?.reloadAndRest?.();
    }else{
          const obj = {cover:{
      type: 1,
      images: [
          "http://dummyimage.com/400x400"
      ]
  }}
  const obj1 = {...values,...obj}
 const res = await AddList(obj1)
 message.success('新增成功');
 setopen(false);
 actionRef.current?.reloadAndRest?.();
    }

  };
    // 删除当前数据
    const Clickdelete = async(record) =>{
      // const res =  await DeleteList(record.id)
      // actionRef.current?.reloadAndRest?.();
      // message.success('删除成功');
      confirm({
        title: `是否删除id为${record.id}的数据`,
        icon: <ExclamationCircleFilled />,
        content: '删除数据',
        okText: '确定',
        okType: 'danger',
        cancelText: '取消',
        async onOk() {
               const res =  await DeleteList(record.id)
      actionRef.current?.reloadAndRest?.();
      message.success('删除成功');
        },
        // 取消的事件
        onCancel() {
        },
      });
      }

  const columns: ProColumns<GithubIssueItem>[] = [
    {
      dataIndex: 'index',
      valueType: 'indexBorder',
      width: 48,
    },
    {
      title: '标题',
      dataIndex: 'title',
      copyable: true,
      ellipsis: true,
      tooltip: '标题过长会自动收缩',
      formItemProps: {
        rules: [
          {
            required: true,
            message: '此项为必填项',
          },
        ],
      },
    },
    // {
    //   disable: true,
    //   title: '状态',
    //   dataIndex: 'status',
    //   filters: true,
    //   onFilter: true,
    //   ellipsis: true,
    //   render: (_, record) => (
    //     record.status === 1 ? '未解决' : '已解决'
    //   ),
    //   // valueType: 'select',
    //   // valueEnum: {
    //   //   all: { text: '超长'.repeat(50) },
    //   //   open: {
    //   //     text: '未解决',
    //   //     status: 'Error',
    //   //   },
    //   //   closed: {
    //   //     text: '已解决',
    //   //     status: 'Success',
    //   //     disabled: true,
    //   //   },
    //   //   processing: {
    //   //     text: '解决中',
    //   //     status: 'Processing',
    //   //   },
    //   // },
    // },
    // {
    //   disable: true,
    //   title: '标签',
    //   dataIndex: 'labels',
    //   search: false,
    //   renderFormItem: (_, { defaultRender }) => {
    //     return defaultRender(_);
    //   },
    //   render: (_, record) => (
    //     <Space>
    //       {record.labels.map(({ name, color }) => (
    //         <Tag color={color} key={name}>
    //           {name}
    //         </Tag>
    //       ))}
    //     </Space>
    //   ),
    // },
    {
      title: '状态',
      key: 'status',
      dataIndex: 'status',
      // valueType: 'date',
      sorter: true,
      // hideInSearch: true,   // 设置搜索栏是否显示 true为隐藏 false为显示
      hideInTable : true, // 设置表格中是否显示  true为隐藏 false为显示
    },
    {
      title: '创建时间',
      key: 'showTime',
      dataIndex: 'pubdate',
      valueType: 'date',
      sorter: true,
      // hideInSearch: true,
    },
    // {
    //   title: '创建时间',
    //   dataIndex: 'created_at',
    //   valueType: 'dateRange',
    //   hideInTable: true,
    //   search: {
    //     transform: (value) => {
    //       return {
    //         startTime: value[0],
    //         endTime: value[1],
    //       };
    //     },
    //   },
    // },
    {
      title: '操作',
      valueType: 'option',
      key: 'option',
      render: (text, record, _, action) => [
        <Button
        type="primary"
          key="editable"
          onClick={()=>ClickEmit(record)}
        >
          编辑
        </Button>,

        <Button  key="deleteable"
        type="primary" danger
        onClick={()=>Clickdelete(record)}
        >
          删除
        </Button>,
        
      ],
    },
  ];

 
  const ClickEmit = async(record) =>{
    setLoading(true)
    setModeltitle('修改数据')
    setopen(true)
  const res = await Emit(record.id)
  setemItuser(res?.data)
  console.log(res,'resss')
  // 给表单的内容赋值
  setdangqianlist(res?.data)
  form.setFieldsValue({title:res?.data?.title,content:res?.data?.content,channel_id:res?.data?.channel_id,imageUrl:res?.data?.cover?.images[0]})
  setLoading(false)
}
  //  useEffect (() =>{
  //   UserList1()
  // })
  const ClickAdd = () =>{
    setopen(true)
    setModeltitle('新增数据')
    setdangqianlist({})
  }

  //点击重置表单的按钮
  const onResetchongzhi = () =>{
    actionRef.current?.reloadAndRest?.();
  }
// 校验方法
const adminEmailVerification = (rule, value, callback)=>{
  console.log(rule)
  console.log(value,'value')
  // if(!value){
  //   callback(new Error('请输入管理员邮箱'));
  //   return
  // } else{
  //   const emailRegex = /^([^@\u4e00-\u9fa5]+)@([^@\\.\u4e00-\u9fa5]+)(\.[^\\.@\u4e00-\u9fa5]+)+$/;  
  //   if(!emailRegex.test(value)){
  //     callback(new Error('邮箱格式错误'));
  //     return
  //   } else{
  //     callback()
  //     this.emailSuffixVerification()
  //   }
  // }
  // callback()
  // return
}
  return (
    <>
    
      <ProTable<GithubIssueItem>
      columns={columns}
      actionRef={actionRef}
      cardBordered
      request={async ( params, sort, filter) => {
        console.log(params,sort, filter);
        //自定义分页,一定要把字段名填对
      const res  = await UserList({per_page:params.pageSize,page:params.current});
      console.log(res?.data?.results,'res')
      
        return {
          data:res?.data?.results,
          success:res?.message === 'OK' ? true : false,
          total: res?.data?.total_count
        }
      }}
      editable={{
        type: 'multiple',
      }}
      columnsState={{
        persistenceKey: 'pro-table-singe-demos',
        persistenceType: 'localStorage',
        defaultValue: {
          option: { fixed: 'right', disable: true },
        },
        onChange(value) {
          console.log('value====: ', value);
        },
      }}
      rowKey="id"
      search={{
        labelWidth: 'auto',
      }}
      options={{
        setting: {
          listsHeight: 400,
        },
      }}
      form={{
        // 由于配置了 transform,提交的参数与定义的不同这里需要转化一下
        syncToUrl: (values, type) => {
          if (type === 'get') {
            return {
              ...values,
              created_at: [values.startTime, values.endTime],
            };
          }
          return values;
        },
      }}
      onReset= {onResetchongzhi}
      pagination={{
        // showSizeChanger: false,
        // pageSize: 10,
        // onChange: (page,pageSize) => console.log(page,pageSize,'page789'),
      }}

      dateFormatter="string"
      headerTitle="高级表格"
      toolBarRender={() => [
        <Button
          key="button"
          icon={<PlusOutlined />}
          onClick={ClickAdd}
          type="primary"
        >
          新建
        </Button>,
        <Dropdown
          key="menu"
          menu={{
            items: [
              {
                label: '1st item',
                key: '1',
              },
              {
                label: '2nd item',
                key: '2',
              },
              {
                label: '3rd item',
                key: '3',
              },
            ],
          }}
        >
          <Button>
            <EllipsisOutlined />
          </Button>
        </Dropdown>,
        
      ]}
    />
    <Modal
        open={open}
        title={Modeltitle}
        okText="确定"
        cancelText="取消"
        okButtonProps={{ autoFocus: true, htmlType: 'submit' }}
        onCancel={() => setopen(false)}
        destroyOnClose
        modalRender={(dom) => (
          <Form
            layout="vertical"
            form={form}
            name="form"
            initialValues={{ modifier: 'public' }}
            clearOnDestroy
            onFinish={(values) => onCreate(values)}
          >
            {dom}
          </Form>
        )}
      >
        <Spin spinning={loading}>
        <Form.Item
          name="title"
          label="标题"
          rules={[{ required: true, message: '标题为必填' }]}
        >
          <Input />
        </Form.Item>
        
        <Form.Item name="content" label="内容"  rules={[{required: false,
      message: '内容为必填'}]}>
   
                  <Input type="textarea" />

        
        </Form.Item>
        <Form.Item name="channel_id" label="id" >
          <Input type="textarea" disabled/>
        </Form.Item>
        <Form.Item name="imageUrl" label="照片">

        <Image
        width={200}
        src={form.getFieldValue('imageUrl')}
        placeholder={
          <Image
            preview={false}
            src={form.getFieldValue('imageUrl')}
            width={200}
          />
        }
      />
        </Form.Item>
        </Spin>
        {/* <Form.Item name="modifier" className="collection-create-form_last-form-item">
          <Radio.Group>
            <Radio value="public">Public</Radio>
            <Radio value="private">Private</Radio>
          </Radio.Group>
        </Form.Item> */}
      </Modal>
    </>
  );
};

export default CustomerList;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值