king
2022-07-14 c9e46b9fa50396d4001d8b195dc485d431e8d590
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import React, {Component} from 'react'
import { is, fromJS } from 'immutable'
import { Cascader } from 'antd'
 
import MKEmitter from '@/utils/events.js'
 
const provinces = require('./data.json')
 
class MKSelect extends Component {
  constructor(props) {
    super(props)
    
    const config = props.config
    let value = config.initval
    let options = fromJS(config.options).toJS()
 
    if (value && config.separator) {
      value = value.split(config.separator)
    } else {
      value = value ? [value] : []
    }
 
    if (config.resourceType === '2') {
      options = provinces
    } else if (options.length > 0) {
      options = this.getOptionTree(options)
    }
 
    this.state = {
      config: fromJS(config).toJS(),
      options: options,
      value,
    }
  }
 
  componentDidMount () {
 
  }
 
  shouldComponentUpdate (nextProps, nextState) {
    return !is(fromJS(this.state), fromJS(nextState))
  }
 
  UNSAFE_componentWillReceiveProps (nextProps) {
    const { config } = this.state
 
    if (config.resourceType === '1' && !is(fromJS(config.oriOptions), fromJS(nextProps.config.oriOptions))) {
      let options = fromJS(nextProps.config.options).toJS()
      
      this.setState({
        options: this.getOptionTree(options)
      })
    }
  }
 
  componentWillUnmount () {
    this.setState = () => {
      return
    }
  }
 
  getOptionTree = (options) => {
    const { config } = this.props
 
    let _options = []
 
    options = options.filter(option => {
      if (option.ParentID === config.topmark) {
        _options.push(option)
        return false
      }
      return true
    })
    
    return this.getTree(_options, options)
  }
 
  getTree = (parents, options) => {
    parents.forEach(parent => {
      parent.children = []
 
      options = options.filter(option => {
        if (option.ParentID === parent.value) {
          parent.children.push(option)
          return false
        }
        return true
      })
 
      if (parent.children.length === 0) {
        parent.children = null
      } else {
        parent.children = this.getTree(parent.children, options)
      }
    })
 
    return parents
  }
 
  selectChange = (val, option) => {
    const { config } = this.state
    let other = {}
 
    let _value = val.join(config.separator)
    let _option = option[option.length - 1]
    
    if (config.subFields && _option) {
      config.subFields.forEach((n, i) => {
        other[n.field] = _option[n.field]
        setTimeout(() => {
          MKEmitter.emit('mkFC', 'input', n.uuid, _option[n.field])
        }, i * 5)
      })
    }
 
    this.props.onChange(_value, other)
    this.setState({value: val})
  }
 
  render() {
    const { value, options } = this.state
 
    return (<Cascader defaultValue={value} options={options} onChange={this.selectChange} placeholder="请选择" />)
  }
}
 
export default MKSelect