UNPKG

zent

Version:

一套前端设计语言和基于React的实现

120 lines (108 loc) 2.9 kB
import React, { Component, PureComponent } from 'react'; import classNames from 'classnames'; import PropTypes from 'prop-types'; import omit from 'lodash/omit'; import getWidth from 'utils/getWidth'; export default class Input extends (PureComponent || Component) { static propTypes = { className: PropTypes.string, prefix: PropTypes.string, type: PropTypes.string, placeholder: PropTypes.string, disabled: PropTypes.bool, readOnly: PropTypes.bool, value: PropTypes.any, defaultValue: PropTypes.any, addonBefore: PropTypes.node, addonAfter: PropTypes.node, onPressEnter: PropTypes.func, onChange: PropTypes.func, autoFocus: PropTypes.bool, width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]) }; static defaultProps = { disabled: false, readOnly: false, prefix: 'zent', type: 'text', autoFocus: false }; componentDidMount() { const { autoFocus } = this.props; if (autoFocus) { this.input.focus(); } } focus() { this.input.focus(); } handleKeyDown = evt => { const { onKeyDown, onPressEnter } = this.props; if (onPressEnter && evt.keyCode === 13) { onPressEnter(evt); } if (onKeyDown) onKeyDown(evt); }; render() { const { addonBefore, addonAfter, prefix, className, type, width } = this.props; const widthStyle = getWidth(width); const isTextarea = type.toLowerCase() === 'textarea'; const wrapClass = classNames( { [`${prefix}-input-wrapper`]: true, [`${prefix}-textarea-wrapper`]: isTextarea, [`${prefix}-input-addons`]: !isTextarea && (addonAfter || addonBefore) }, className ); // 黑名单,下面这些props不应该带入到Input上 let inputProps = omit(this.props, [ 'className', 'prefix', 'addonBefore', 'addonAfter', 'onPressEnter', 'width' ]); if (isTextarea) { inputProps = omit(inputProps, ['type']); return ( <div className={wrapClass} style={widthStyle}> <textarea ref={input => { this.input = input; }} className={`${prefix}-textarea`} {...inputProps} onKeyDown={this.handleKeyDown} /> </div> ); } return ( <div className={wrapClass} style={widthStyle}> {addonBefore && ( <span className={`${prefix}-input-addon-before`}>{addonBefore}</span> )} <input ref={input => { this.input = input; }} className={`${prefix}-input`} {...inputProps} onKeyDown={this.handleKeyDown} /> {addonAfter && ( <span className={`${prefix}-input-addon-after`}>{addonAfter}</span> )} </div> ); } }