import React, {Component} from 'react'
|
import PropTypes from 'prop-types'
|
import { is, fromJS } from 'immutable'
|
import { Select, Input } from 'antd'
|
|
import './index.scss'
|
|
const { Option } = Select
|
|
class StyleInput extends Component {
|
static propTpyes = {
|
defaultValue: PropTypes.any,
|
options: PropTypes.any,
|
value: PropTypes.any,
|
onChange: PropTypes.func,
|
}
|
|
state = {
|
value: '',
|
unit: '',
|
options: null
|
}
|
|
UNSAFE_componentWillMount () {
|
const { defaultValue, value, options } = this.props
|
let val = ''
|
let unit = ''
|
let _options = ['px']
|
|
if (value !== undefined) {
|
val = value
|
} else if (defaultValue !== undefined) {
|
val = defaultValue
|
}
|
|
if (options && options.length > 0) {
|
_options = options
|
}
|
|
unit = _options[0]
|
|
if (val) {
|
if (val.indexOf('px') > -1) {
|
unit = 'px'
|
} else if (val.indexOf('%') > -1) {
|
unit = '%'
|
} else if (val.indexOf('vw') > -1) {
|
unit = 'vw'
|
} else if (val.indexOf('vh') > -1) {
|
unit = 'vh'
|
}
|
}
|
|
let _val = parseInt(val)
|
|
if (isNaN(_val)) {
|
_val = ''
|
}
|
|
this.setState({value: _val, options: _options, unit})
|
}
|
|
shouldComponentUpdate (nextProps, nextState) {
|
return !is(fromJS(this.state), fromJS(nextState))
|
}
|
|
UNSAFE_componentWillReceiveProps(nextProps) {
|
if (nextProps.value !== undefined && nextProps.value !== this.state.value) {
|
let val = nextProps.value
|
let unit = this.state.unit
|
|
if (val) {
|
if (val.indexOf('px') > -1) {
|
unit = 'px'
|
} else if (val.indexOf('%') > -1) {
|
unit = '%'
|
} else if (val.indexOf('vw') > -1) {
|
unit = 'vw'
|
} else if (val.indexOf('vh') > -1) {
|
unit = 'vh'
|
}
|
}
|
|
let _val = parseInt(val)
|
|
if (isNaN(_val)) {
|
_val = ''
|
}
|
|
this.setState({value: _val, unit})
|
}
|
}
|
|
componentDidMount () {}
|
|
/**
|
* @description 组件销毁,清除state更新,清除快捷键设置
|
*/
|
componentWillUnmount () {
|
this.setState = () => {
|
return
|
}
|
}
|
|
changeValue = (e) => {
|
const { unit } = this.state
|
let val = e.target.value
|
let _val = parseInt(val)
|
|
if (isNaN(_val)) {
|
_val = ''
|
}
|
|
this.setState({
|
value: _val,
|
})
|
|
if (this.props.onChange) {
|
if (!_val) {
|
this.props.onChange('0px')
|
} else {
|
this.props.onChange(`${_val}${unit}`)
|
}
|
}
|
}
|
|
changeUnit = (val) => {
|
const { value } = this.state
|
|
this.setState({unit: val})
|
if (value && this.props.onChange) {
|
this.props.onChange(`${value}${val}`)
|
}
|
}
|
|
render () {
|
const { value, options, unit } = this.state
|
|
return (
|
<div className="style-input-box">
|
<Input value={value} addonAfter={
|
options.length > 1 ?
|
<Select value={unit} onChange={this.changeUnit}>
|
{options.map(item => <Option key={item} value={item}>{item}</Option>)}
|
</Select> :
|
<div className="single-unit">{unit}</div>
|
} onChange={this.changeValue}/>
|
</div>
|
)
|
}
|
}
|
|
export default StyleInput
|