editableFormItem.jsx 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  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. const options = (
  61. <>
  62. <Option key="男" vlaue="男">男</Option>
  63. <Option key="女" vlaue="女">女</Option>
  64. </>
  65. )
  66. cell = (
  67. <Select
  68. defaultValue={val}
  69. ref={inputRef}
  70. // onBlur={save}
  71. onChange={(value) => save({currentTarget: {value}})}
  72. className="zh-width-100P"
  73. >
  74. {options}
  75. </Select>
  76. )
  77. break
  78. default:
  79. cell = (
  80. <Input
  81. ref={inputRef}
  82. onPressEnter={save}
  83. onBlur={save}
  84. defaultValue={val}
  85. // onChange={handleOnChange}
  86. />
  87. )
  88. break
  89. }
  90. } else {
  91. cell = (
  92. <div className="editable-cell-value-wrap" onClick={toggleEdit}>
  93. {val}
  94. </div>
  95. )
  96. }
  97. return (
  98. <Col span={span}>
  99. <Row wrap={false}>
  100. <Col flex="100px" className="zh-text-right zh-mg-bottom-8">
  101. <span className="zh-lh-32 zh-mg-right-10">{label}:</span>
  102. </Col>
  103. <Col flex="auto">{cell}</Col>
  104. </Row>
  105. </Col>
  106. )
  107. }
  108. export default EditableFormItem