UNPKG

6.57 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4exports.default = undefined;
5
6var _extends2 = require('babel-runtime/helpers/extends');
7
8var _extends3 = _interopRequireDefault(_extends2);
9
10var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
11
12var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
13
14var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
15
16var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
17
18var _inherits2 = require('babel-runtime/helpers/inherits');
19
20var _inherits3 = _interopRequireDefault(_inherits2);
21
22var _class, _temp2;
23
24var _react = require('react');
25
26var _react2 = _interopRequireDefault(_react);
27
28var _propTypes = require('prop-types');
29
30var _propTypes2 = _interopRequireDefault(_propTypes);
31
32var _util = require('../../util');
33
34var _util2 = require('../util');
35
36function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
37
38var noop = _util.func.noop;
39
40/**
41 * Upload.Selecter
42 * @description [底层能力] 可自定义样式的文件选择器
43 */
44
45var Selecter = (_temp2 = _class = function (_React$Component) {
46 (0, _inherits3.default)(Selecter, _React$Component);
47
48 function Selecter() {
49 var _temp, _this, _ret;
50
51 (0, _classCallCheck3.default)(this, Selecter);
52
53 for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
54 args[_key] = arguments[_key];
55 }
56
57 return _ret = (_temp = (_this = (0, _possibleConstructorReturn3.default)(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.onSelect = function (e) {
58 var files = e.target.files;
59 var filesArr = files.length ? Array.prototype.slice.call(files) : [files];
60
61 filesArr.forEach(function (file) {
62 file.uid = (0, _util2.uid)();
63 });
64
65 _this.props.onSelect(filesArr);
66 }, _this.onClick = function () {
67 var el = _this.fileRef;
68 if (!el) {
69 return;
70 }
71 // NOTE: 在 IE 下,el.value = '' 在 el.click() 之后,会触发 input[type=file] 两次 onChange
72 el.value = '';
73 el.click();
74 }, _this.onKeyDown = function (e) {
75 if (e.key === 'Enter') {
76 _this.onClick();
77 }
78 }, _this.onDrop = function (e) {
79 e.preventDefault();
80
81 var files = e.dataTransfer.files;
82 var filesArr = Array.prototype.slice.call(files);
83
84 _this.props.onDrop(filesArr);
85 }, _this.onDragOver = function (e) {
86 e.preventDefault();
87 _this.props.onDragOver(e);
88 }, _this.saveFileRef = function (ref) {
89 _this.fileRef = ref;
90 }, _temp), (0, _possibleConstructorReturn3.default)(_this, _ret);
91 }
92
93 /**
94 * 点击上传按钮
95 * @return {void}
96 */
97
98
99 /**
100 * 键盘事件
101 * @param {SyntheticEvent} e
102 * @return {void}
103 */
104
105
106 /**
107 * 拖拽
108 * @param {SyntheticEvent} e
109 * @return {void}
110 */
111
112
113 Selecter.prototype.render = function render() {
114 var _props = this.props,
115 accept = _props.accept,
116 multiple = _props.multiple,
117 capture = _props.capture,
118 webkitdirectory = _props.webkitdirectory,
119 children = _props.children,
120 id = _props.id,
121 disabled = _props.disabled,
122 dragable = _props.dragable,
123 style = _props.style,
124 className = _props.className,
125 name = _props.name;
126
127
128 var events = {};
129 if (!disabled) {
130 events = (0, _extends3.default)({
131 onClick: this.onClick,
132 onKeyDown: this.onKeyDown,
133 tabIndex: '0'
134 }, dragable ? {
135 onDrop: this.onDrop,
136 onDragOver: this.onDragOver,
137 onDragLeave: this.props.onDragLeave
138 } : {});
139 }
140
141 var otherProps = {};
142 if (webkitdirectory) {
143 otherProps.webkitdirectory = '';
144 }
145 if (capture) {
146 otherProps.capture = capture;
147 }
148
149 return _react2.default.createElement(
150 'div',
151 (0, _extends3.default)({ role: 'application', style: style, className: className }, events),
152 _react2.default.createElement('input', (0, _extends3.default)({}, otherProps, {
153 type: 'file',
154 name: name,
155 id: id,
156 ref: this.saveFileRef,
157 style: { display: 'none' },
158 accept: accept,
159 'aria-hidden': true,
160 multiple: multiple,
161 onChange: this.onSelect,
162 disabled: disabled
163 })),
164 children
165 );
166 };
167
168 return Selecter;
169}(_react2.default.Component), _class.propTypes = {
170 id: _propTypes2.default.string,
171 style: _propTypes2.default.object,
172 className: _propTypes2.default.string,
173 /**
174 * 是否禁用上传功能
175 */
176 disabled: _propTypes2.default.bool,
177 /**
178 * 是否支持多选文件,`ie10+` 支持。开启后按住 ctrl 可选择多个文件
179 */
180 multiple: _propTypes2.default.bool,
181 /**
182 * 是否支持上传文件夹,仅在 chorme 下生效
183 */
184 webkitdirectory: _propTypes2.default.bool,
185 /**
186 * 调用系统设备媒体
187 */
188 capture: _propTypes2.default.string,
189 /**
190 * 是否支持拖拽上传,`ie10+` 支持。
191 */
192 dragable: _propTypes2.default.bool,
193 /**
194 * 接受上传的文件类型 (image/png, image/jpg, .doc, .ppt) 详见 [input accept attribute](https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/Input#attr-accept)
195 */
196 accept: _propTypes2.default.string,
197 /**
198 * 文件选择回调
199 */
200 onSelect: _propTypes2.default.func,
201 /**
202 * 拖拽经过回调
203 */
204 onDragOver: _propTypes2.default.func,
205 /**
206 * 拖拽离开回调
207 */
208 onDragLeave: _propTypes2.default.func,
209 /**
210 * 拖拽完成回调
211 */
212 onDrop: _propTypes2.default.func,
213 children: _propTypes2.default.node,
214 name: _propTypes2.default.string
215}, _class.defaultProps = {
216 name: 'file',
217 multiple: false,
218 onSelect: noop,
219 onDragOver: noop,
220 onDragLeave: noop,
221 onDrop: noop
222}, _temp2);
223Selecter.displayName = 'Selecter';
224exports.default = Selecter;
225module.exports = exports['default'];
\No newline at end of file