Edit.jsx 2.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import React from 'react';
  2. import { Button, Card, Form } from 'antd';
  3. import { useSearchParams, useNavigate } from "react-router-dom";
  4. import useBool from '@/utils/hooks/useBool';
  5. import { restful } from '@/utils/request';
  6. import Page from './index';
  7. const FormItem = Form.Item;
  8. const formItemLayout = { labelCol: { span: 6 }, wrapperCol: { span: 14 } };
  9. export default (props) => {
  10. /**
  11. * resource 用来确定应该调用哪个接口
  12. * dataFunc 将 form 表单数据转换为接口需要格式, 一般情况下不需要这个操作
  13. * formDataFunc 将接口返回的值转换为 form 表单数据格式, 一般情况下不需要这个操作
  14. * width form 表单宽度, 默认 800px
  15. */
  16. const { resource, dataFunc, formDataFunc, width = '800px' } = props;
  17. const [loading, startLoading, stopLoading] = useBool();
  18. const [form] = Form.useForm();
  19. const navigate = useNavigate();
  20. // 获取 id query 参数, 如果存在说明是编辑,而不是新增
  21. const [params] = useSearchParams();
  22. const id = params.get("id");
  23. // 接口汇总
  24. const api = React.useMemo(() => {
  25. // 通过 resource 知道是哪个接口
  26. // 通过 restfule 生成 增删改查的接口
  27. const apis = restful(resource);
  28. // 返回三个接口
  29. // 1. 获取详情
  30. // 2. 新增
  31. // 3. 更新
  32. return {
  33. get: apis[1],
  34. save: apis[2],
  35. update: apis[3],
  36. }
  37. }, [resource]);
  38. const navBack = () => {
  39. const t = setTimeout(() => {
  40. navigate(-1);
  41. clearTimeout(t);
  42. }, 600);
  43. }
  44. // 表单提交
  45. const onFinish = (values) => {
  46. startLoading();
  47. // 可能需要转换下格式
  48. const data = dataFunc ? dataFunc(id, values) : values;
  49. if (id) {
  50. api.update(id, data).then(() => {
  51. stopLoading();
  52. navBack();
  53. }).catch(stopLoading);
  54. } else {
  55. api.save(data)
  56. .then(() => {
  57. stopLoading();
  58. navBack();
  59. }).catch(stopLoading);
  60. }
  61. }
  62. // 查询详情
  63. React.useEffect(() => {
  64. if (id) {
  65. api.get(id).then(res => {
  66. // 此处可能需要转换下数据格式
  67. const formData = formDataFunc ? formDataFunc(res) : res;
  68. form.setFieldsValue(formData);
  69. })
  70. }
  71. }, [id]);
  72. return (
  73. <Page>
  74. <Card>
  75. <Form {...formItemLayout} form={form} onFinish={onFinish} style={{width}}>
  76. {props.children}
  77. <FormItem label=" " colon={false}>
  78. <Button type="default" onClick={() => navigate(-1)}>
  79. 取消
  80. </Button>
  81. <Button
  82. type="primary"
  83. htmlType="submit"
  84. style={{ marginLeft: '4em' }}
  85. loading={loading}
  86. >
  87. 确认
  88. </Button>
  89. </FormItem>
  90. </Form>
  91. </Card>
  92. </Page>
  93. )
  94. }