> 文档中心 > PC端react表单组件

PC端react表单组件

InputTooltip

import React from 'react';import { Input, Tooltip } from 'antd';const InputTooltip = (props) => {  const { value, onChange = () => {}, disabled, childProps, wrapProps } = props;  return (          
onChange(e.target.value)} disabled={disabled} {...childProps} />
);};export default InputTooltip;

SreachSelect

import React, { useState, useEffect } from 'react';import Debounce from 'lodash/debounce';import { Select, Spin, Empty, Modal, Table, Form, Input, Row, Col, Button } from 'antd';import { MoreOutlined } from '@ant-design/icons';import styles from './index.less';const SearchSelect = (props) => {  const {    handleSearch = () => {},    width,    value,    onChange = () => {},    onSaveData = () => {},    showArrow = true,    showSearch = true,    extraOption = {},    disabled = false,    allowClear = true,    defaultOptions = [],    formItemProps = {},    columnConfig = [],    showMore = false,    rowKey = '',    rowLabel = '',    placeholder = '',    labelInValue = false,    customerChange = () => {},    isOthers = false,  } = props || {};  let selectVal = value;  if (typeof value === 'object') {    selectVal = value?.value;    defaultOptions.push(value);  }  const [form] = Form.useForm();  const [options, setOptions] = useState([]);  const [originData, setOriginData] = useState([]);  const [pagination, setPagination] = useState({ pageIndex: 1, pageSize: 10 });  const [total, setTotal] = useState(0);  const [searchVal, setSearchVal] = useState('');  const [loading, setLoading] = useState(false);  const [visible, setVisible] = useState(false);  const [tableData, setTableData] = useState([]);  const [selectedRow, setSelectedRow] = useState({});  const updateAllData = (    pageIndex,    pageSize,    totalCount,    dataSource = [],    originDataSource = [],  ) => {    setOptions(dataSource);    setOriginData(originDataSource);    onSaveData(originDataSource);    setPagination({ pageIndex, pageSize });    setTotal(totalCount);    setLoading(false);  };  const handleScrollBottom = async (e) => {    e.stopPropagation();    const { clientHeight, scrollTop, scrollHeight } = e.target;    if (Math.ceil(scrollTop + clientHeight) >= scrollHeight && !loading) {      const { pageIndex, pageSize } = pagination;      if (pageIndex === 1 || pageIndex  {    setLoading(true);    setOptions([]);    const res = await handleSearch({ value: val, pageIndex: 1, pageSize: 10 });    updateAllData(res?.pageIndex + 1, res?.pageSize, res?.total, res?.data, res?.originData);    setSearchVal(val);  }, 500);  const addExtraOption = (obj = {}) => {    if (obj?.value && options?.filter(item => item?.value === obj?.value)?.length  {    const val = form?.getFieldsValue()?.[formItemProps?.name];    setLoading(true);    let searchText = val;    if (val) {      searchText = val?.trim();    }    const res = await handleSearch({ value: searchText, pageIndex, pageSize });    setTableData(res?.originData);    setTotal(res?.total);    setPagination({ pageIndex: res?.pageIndex, pageSize: res?.pageSize });    setLoading(false);  };  const rowSelection = {    columnWidth: 52,    type: 'radio',    selectedRowKeys: [selectedRow?.[rowKey]],    onChange: (_, selectedRows) => {      setSelectedRow(selectedRows[0]);    },    getCheckboxProps: record => ({      name: record?.[rowKey],      disabled: record?.disabled,    }),  };  const handleModalOk = () => {    if (selectedRow?.[rowKey] || selectedRow?.[rowKey] === 0) {      addExtraOption({ label: selectedRow?.[rowLabel], value: selectedRow?.[rowKey] });      const labelValue = { value: selectedRow?.[rowKey], key: selectedRow?.[rowKey], label: selectedRow?.[rowLabel],      };      labelInValue ? onChange(labelValue) : onChange(selectedRow?.[rowKey]);      customerChange(selectedRow);    }    setVisible(false);  };  const formatData = arr =>    arr?.reduce((item, next) => {      typeof item.find(ele => ele?.['value'] === next?.['value']) === 'undefined' && item.push({ ...next, label: next?.code ? `${next?.label}_${next?.code}` : next?.label });      return item;    }, []);  useEffect(() => {    onSearch('');  }, []);  useEffect(() => {    addExtraOption(extraOption);    // if (extraOption?.value && !options?.find(item => item?.value === extraOption?.value)?.value) {    //   setOptions([extraOption, ...options]);    // }  }, [extraOption?.value]);  return (           {   onChange(val);   customerChange(originData.find(item => item?.[rowKey] === val)); }} showArrow={showArrow} filterOption={false} options={formatData([...options, ...defaultOptions])} dropdownRender={menu => (   
{menu} {loading && options?.length > 0 ? ( ) : null}
)} onSearch={val => onSearch(val ? val?.trim() : val)} allowClear={allowClear} onClear={() => onSearch('')} virtual={false} onPopupScroll={e => handleScrollBottom(e)} notFoundContent={loading ? : } // getPopupContainer={triggerNode => triggerNode.parentElement} suffixIcon={ selectVal || !showMore || disabled ? null : ( { setVisible(true); onPageChange();}} /> ) } labelInValue={labelInValue} /> {visible && ( handleModalOk()} onCancel={() => setVisible(false)} width={800} > ({onClick: () => { if (record?.disabled) { return; } setSelectedRow(record);}, })} pagination={{current: pagination.pageIndex,total,pageSizeOptions: ['5', '10', '15', '20', '30'],pageSize: isOthers ? pagination.pageSize + 1 : pagination.pageSize,size: 'small', }} dataSource={tableData} columns={columnConfig} count={total} loading={loading} scroll={{ x: columnConfig.reduce((pre, cur) => pre + cur.width), y: 300 }} onChange={page => onPageChange(page.current, page.pageSize)} rowSelection={rowSelection} /> )} );};export default SearchSelect;

MyDatePicker

import React, { Component } from 'react';import { DatePicker } from 'antd';import moment from 'moment';class MyDatePicker extends Component {  render() {    const { value, onChange = () => {}, format, ...rest } = this.props;    return (       0 ? moment(value) : null} format={format} onChange={val => onChange(val ? moment(val).format(format) : null)}      />    );  }}export default MyDatePicker;

MyFormItem

import React from 'react';import { Form, Input, Select, InputNumber } from 'antd';import MyDatePicker from '@/pages/bigclientmanage/add/components/MyDatePicker';import SearchSelect from '@/components/SearchSelect';import InputTooltip from '@/components/InputTooltip';const MyFormItem = (props) => {  const { type, label, name, rules, childProps, wrapProps } = props || {};  let childNode = ;  switch (type) {    case 'Input':      childNode = ;      break;    case 'Select':      childNode = ;      break;    case 'MultipleSelect':      childNode = (       );      break;    case 'InputNumber':      childNode = (       );      break;    case 'DatePicker':      childNode = ;      break;    case 'SearchSelect':      childNode = ;      break;    case 'InputTooltip':      childNode = ;      break;    default:      break;  }  return (          {childNode}      );};export default MyFormItem;

茶叶商城