editableFormItem.jsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import consts from '@/basic/consts'
  2. import { apiUpdateContract } from '@/services/contact'
  3. import { Input, Row, Col, Select } from 'antd'
  4. import React, { useState, useEffect, useRef } from 'react'
  5. import './index.less'
  6. const EditableFormItem = ({ label, dataIndex, record, dataId, span, editCellType }) => {
  7. const [editing, setEditing] = useState(false)
  8. const inputRef = useRef(null)
  9. const [val, setVal] = useState('')
  10. useEffect(() => {
  11. setVal('')
  12. }, [])
  13. useEffect(() => {
  14. // 处于编辑状态自动聚焦
  15. if (editing) {
  16. inputRef.current.focus()
  17. }
  18. // 当val为空时,需要设置默认值
  19. if (!val) {
  20. setVal(record)
  21. }
  22. }, [record, editing])
  23. // 单独设置一个依赖,防止dataId变化
  24. useEffect(() => {
  25. setVal(record)
  26. }, [dataId])
  27. const toggleEdit = () => {
  28. setEditing(!editing)
  29. }
  30. const handleConfirm = async value => {
  31. const { code = -1 } = await apiUpdateContract({ [dataIndex]: value, id: dataId })
  32. if (code === consts.RET_CODE.SUCCESS) {
  33. toggleEdit()
  34. }
  35. }
  36. const save = async e => {
  37. const { value = '' } = e.currentTarget
  38. if (value === record || !value) {
  39. return
  40. }
  41. setVal(value)
  42. await handleConfirm(value)
  43. toggleEdit()
  44. }
  45. // const handleOnChange = e => {
  46. // setVal(value)
  47. // const { value = '' } = e.currentTarget
  48. // }
  49. let cell = null
  50. if (editing) {
  51. switch (editCellType) {
  52. case 'cascader':
  53. // cell = ()
  54. break
  55. case 'select':
  56. cell = (
  57. <Select
  58. defaultValue="男"
  59. >
  60. <option vlaue="男">男</option>
  61. <option vlaue="女">女</option>
  62. </Select>
  63. )
  64. break
  65. default:
  66. cell = (
  67. <Input
  68. ref={inputRef}
  69. onPressEnter={save}
  70. onBlur={save}
  71. defaultValue={val}
  72. // onChange={handleOnChange}
  73. />
  74. )
  75. break
  76. }
  77. } else {
  78. cell = (
  79. <div className="editable-cell-value-wrap" onClick={toggleEdit}>
  80. {val}
  81. </div>
  82. )
  83. }
  84. return (
  85. <Col span={span}>
  86. <Row wrap={false}>
  87. <Col flex="100px" className="zh-text-right zh-mg-bottom-8">
  88. <span className="zh-lh-32 zh-mg-right-10">{label}:</span>
  89. </Col>
  90. <Col flex="auto">{cell}</Col>
  91. </Row>
  92. </Col>
  93. )
  94. }
  95. export default EditableFormItem