editableFormItem.jsx 2.5 KB

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