zarm-mobile
Version:
UI for react.js
179 lines (144 loc) • 6.69 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _classnames = require('classnames');
var _classnames2 = _interopRequireDefault(_classnames);
var _handleFileInfo = require('./utils/handleFileInfo');
var _handleFileInfo2 = _interopRequireDefault(_handleFileInfo);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
/**
* 设置选择前的方法,获取选择文件的相关信息,需要时可以对图片进行压缩、改变图片尺寸。
*
* multiple: 默认为 false,设置为 true 之后一次可以选择多张,onChange 事件调用之后返回一个数组,
* 不设置或者设置为 false,onChange 事件调用之后返回一个对象。
* disabled: 传递之后不可以点击上传,整个选择组件会设置为半透明状态,透明度为 0.5。
* quality: 没有默认值,不设置不会进行压缩。
* accept: 设置选择的文件类型,默认为所有类型,只有文件类型为图片(image/*)的时候会有本地预览图。
* onChange: () => { file, fileType, fileSize, fileName, thumbnail }。
* onBeforeSelect: () => boolean,返回 false 的时候阻止后续的选择事件。
*/
var Uploader = function (_PureComponent) {
_inherits(Uploader, _PureComponent);
function Uploader(props) {
_classCallCheck(this, Uploader);
var _this = _possibleConstructorReturn(this, (Uploader.__proto__ || Object.getPrototypeOf(Uploader)).call(this, props));
_this.state = {
fileList: []
};
_this.handleDefaultInput = _this.handleDefaultInput.bind(_this);
_this.handleClick = _this.handleClick.bind(_this);
_this.handleChange = _this.handleChange.bind(_this);
return _this;
}
_createClass(Uploader, [{
key: 'handleDefaultInput',
value: function handleDefaultInput(e) {
// 防止选择同一张图片两次造成 onChange 事件不触发
e.target.value = null;
var _props = this.props,
onBeforeSelect = _props.onBeforeSelect,
disabled = _props.disabled;
// 阻止 input onChange 默认事件
if (onBeforeSelect() === false || disabled) {
e.preventDefault();
}
}
}, {
key: 'handleClick',
value: function handleClick() {
this.file.click();
}
}, {
key: 'handleChange',
value: function handleChange(e) {
var _props2 = this.props,
onChange = _props2.onChange,
quality = _props2.quality,
multiple = _props2.multiple;
var files = Array.from(e.target.files);
var fileList = [];
var getFileInfo = function getFileInfo(data) {
if (multiple) {
fileList.push(data);
if (files.length === fileList.length) {
onChange(fileList);
}
} else {
onChange(data);
}
};
files && files.map(function (file) {
return (0, _handleFileInfo2.default)({ file: file, quality: quality }, getFileInfo);
});
}
}, {
key: 'render',
value: function render() {
var _this2 = this;
var _props3 = this.props,
prefixCls = _props3.prefixCls,
className = _props3.className,
multiple = _props3.multiple,
accept = _props3.accept,
capture = _props3.capture,
disabled = _props3.disabled,
children = _props3.children;
var compStyle = (0, _classnames2.default)(prefixCls, _defineProperty({
disabled: disabled
}, className, !!className));
return _react2.default.createElement(
'div',
{ className: compStyle },
_react2.default.createElement('input', {
className: prefixCls + '-input',
type: 'file',
ref: function ref(ele) {
_this2.file = ele;
},
accept: accept,
multiple: multiple,
capture: capture,
onClick: this.handleDefaultInput,
onChange: this.handleChange
}),
_react2.default.createElement('span', { className: prefixCls + '-trigger', onClick: this.handleClick }),
children
);
}
}]);
return Uploader;
}(_react.PureComponent);
Uploader.propTypes = {
prefixCls: _react.PropTypes.string,
className: _react.PropTypes.string,
disabled: _react.PropTypes.bool,
multiple: _react.PropTypes.bool,
quality: _react.PropTypes.number,
accept: _react.PropTypes.string,
capture: _react.PropTypes.string,
onChange: _react.PropTypes.func,
onBeforeSelect: _react.PropTypes.func
};
Uploader.defaultProps = {
prefixCls: 'za-uploader',
className: null,
disabled: false,
multiple: false,
accept: null,
capture: null,
// () => { file, fileType, fileSize, fileName, thumbnail }
onChange: function onChange() {},
// () => boolean
onBeforeSelect: function onBeforeSelect() {
return true;
}
};
exports.default = Uploader;