UNPKG

zarm-mobile

Version:
179 lines (144 loc) 6.69 kB
'use strict'; 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;