LazyCascader.jsx 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import { Cascader } from 'antd'
  2. import React, { forwardRef, useEffect } from 'react'
  3. import { connect } from 'dva'
  4. const CLazyCascader = props => {
  5. const { refinstance, options, dispatch, onChange, changeOnSelect = false, ...resetProps } = props
  6. // console.log(props.defaultValue)
  7. useEffect(() => {
  8. if (!options.length) {
  9. dispatch({
  10. type: 'district/fetch'
  11. })
  12. }
  13. // if (refinstance && refinstance.current) {
  14. // refinstance.current.focus()
  15. // }
  16. }, [])
  17. const triggerChange = (value, local = '') => {
  18. if (onChange) {
  19. onChange(value, local)
  20. }
  21. }
  22. const handleOnChange = (value, selectedOptions) => {
  23. const local = selectedOptions.reduce((prev, curr) => {
  24. return `${prev}${prev ? ',' : ''}${curr.name}`
  25. }, '')
  26. triggerChange(value, local)
  27. }
  28. const loadData = selectedOptions => {
  29. const targetOption = selectedOptions[selectedOptions.length - 1]
  30. targetOption.loading = true
  31. // load options lazily
  32. dispatch({
  33. type: 'district/fetch',
  34. payload: { parentId: targetOption.id, level: targetOption.level }
  35. })
  36. }
  37. return (
  38. <Cascader
  39. placeholder="省/市/区"
  40. options={options}
  41. ref={refinstance}
  42. onChange={handleOnChange}
  43. loadData={loadData}
  44. fieldNames={{ label: 'name', value: 'id' }}
  45. changeOnSelect={changeOnSelect}
  46. {...resetProps}
  47. />
  48. )
  49. }
  50. const LazyCascader = connect(({ district }) => ({
  51. options: district.data
  52. }))(CLazyCascader)
  53. export default forwardRef((props, ref) => {
  54. return <LazyCascader {...props} refinstance={ref} />
  55. })
  56. // export default connect(({ district }) => ({
  57. // options: district.data
  58. // }))(LazyCascader)