inputUpdate.tsx 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { Form, Input, InputRef } from "antd";
  2. import React, { useEffect, useRef, useState } from "react"
  3. interface Props {
  4. title: string,
  5. dataIndex: string
  6. record: any;
  7. handleSave: (data: any) => void
  8. isNum?: boolean
  9. }
  10. const InputUpdate: React.FC<Props> = ({ title, dataIndex, record, handleSave, isNum }) => {
  11. const [form] = Form.useForm();
  12. const [editing, setEditing] = useState(false);
  13. const inputRef = useRef<InputRef>(null);
  14. useEffect(() => {
  15. if (editing) {
  16. inputRef.current!.focus({ cursor: 'all' });
  17. }
  18. }, [editing]);
  19. const toggleEdit = () => {
  20. setEditing(!editing);
  21. form.setFieldsValue({ [dataIndex]: record[dataIndex] });
  22. };
  23. const save = async () => {
  24. try {
  25. const values = await form.validateFields();
  26. if (values?.[dataIndex] !== (record as any)?.[dataIndex]) {
  27. handleSave({ ...record, ...values });
  28. }
  29. toggleEdit();
  30. } catch (errInfo) {
  31. console.log('Save failed:', errInfo);
  32. }
  33. };
  34. let childNode = editing ? (<Form form={form}><Form.Item
  35. style={{ margin: 0 }}
  36. name={dataIndex}
  37. rules={[
  38. { required: true, message: `${title} is required.` },
  39. {
  40. required: isNum, message: `大于0,并且填写数字`, validator(rule, value, callback) {
  41. let regPos = /^[0-9]+.?[0-9]*/; //判断是否是数字。
  42. if (!isNum) {
  43. return Promise.resolve()
  44. } else {
  45. if (!regPos.test(value)) {
  46. return Promise.reject()
  47. }
  48. if (value >= 0) {
  49. return Promise.resolve()
  50. } else {
  51. return Promise.reject()
  52. }
  53. }
  54. },
  55. }
  56. ]}
  57. >
  58. <Input ref={inputRef} size="small" onPressEnter={save} onBlur={save} bordered />
  59. </Form.Item></Form>) : (<span className="editable-cell-value-wrap ellipsisText" onClick={toggleEdit}>
  60. {title}
  61. </span>)
  62. return childNode;
  63. }
  64. export default React.memo(InputUpdate)