ttk-app-core
Version:
@ttk/recat enterprise develop framework
81 lines (72 loc) • 2.45 kB
JavaScript
import React, { memo, useCallback, useState, useEffect } from 'react'
import { Button, Input, Cascader } from 'antd';
import classNames from 'classnames'
import './style.less'
/**
* @param {string} btnText 按钮文本: 非空时显示按钮
* @param {function} onBtnClick 按钮点击事件
*/
export default memo(function EpyInput(props) {
const {
label = '',
labelWidth = 100,
btnText = '',
btnWidth = 100,
btnLoading = false,
btnDisabled = false,
size = 'middle',
type = 'text',
validateStatus = 'success',
help = '',
value: defaultValue,
require,
onBtnClick,
...otherProps
} = props;
const [isFocusing, setIsFocusing] = useState(false)
const className = classNames({
'epy-input': true,
[props.className]: !!props.className,
['epy-input-' + size]: true,
['epy-input-' + validateStatus]: true,
'epy-input-focus': isFocusing,
})
const handleFocus = useCallback((...args) => {
setIsFocusing(true)
props.onFocus && props.onFocus(...args)
}, [props.onFocus])
const handleBlur = useCallback((...args) => {
setIsFocusing(false)
props.onBlur && props.onBlur(...args)
}, [props.onBlur])
const handleBtnClick = useCallback((...args) => {
onBtnClick && onBtnClick(...args)
}, [onBtnClick])
return (
<div className={className}>
<label className={"label" + (require ? ' require' : '')} style={{ width: labelWidth }}>{label}</label>
{
type !== 'cascader' && type !== 'password' &&
<>
<Input {...otherProps} type={type} defaultValue={defaultValue} className="input" onFocus={handleFocus} onBlur={handleBlur} />
{
btnText &&
<>
<span className="btn-placeholder" style={{ width: btnWidth }}></span>
<Button type="text" className="button" loading={btnLoading} disabled={btnDisabled} style={{ width: btnWidth }} onClick={handleBtnClick}>{btnText}</Button>
</>
}
</>
}
{
type === 'password' &&
<Input.Password {...otherProps} defaultValue={defaultValue} className="input" onFocus={handleFocus} onBlur={handleBlur} />
}
{
type === 'cascader' &&
<Cascader {...otherProps} defaultValue={defaultValue} className="cascader" onFocus={handleFocus} onBlur={handleBlur} />
}
<p className="tips" style={{ left: 10 }}>{help}</p>
</div>
)
})