vant-fork
Version:
Lightweight Mobile UI Components built on Vue
121 lines (103 loc) • 2.85 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _create = _interopRequireDefault(require("../utils/create"));
var _default = (0, _create.default)({
render: function render() {
var _vm = this;
var _h = _vm.$createElement;
var _c = _vm._self._c || _h;
return _c('div', {
class: _vm.b()
}, [_vm._t("default"), _c('input', _vm._b({
ref: "input",
class: _vm.b('input'),
attrs: {
"type": "file",
"accept": _vm.accept,
"disabled": _vm.disabled
},
on: {
"change": _vm.onChange
}
}, 'input', _vm.$attrs, false))], 2);
},
name: 'uploader',
inheritAttrs: false,
props: {
disabled: Boolean,
beforeRead: Function,
afterRead: Function,
accept: {
type: String,
default: 'image/*'
},
resultType: {
type: String,
default: 'dataUrl'
},
maxSize: {
type: Number,
default: Number.MAX_VALUE
}
},
methods: {
onChange: function onChange(event) {
var _this = this;
var files = event.target.files;
if (this.disabled || !files.length) {
return;
}
files = files.length === 1 ? files[0] : [].slice.call(files, 0);
if (!files || this.beforeRead && !this.beforeRead(files)) {
return;
}
if (Array.isArray(files)) {
Promise.all(files.map(this.readFile)).then(function (contents) {
var oversize = false;
var payload = files.map(function (file, index) {
if (file.size > _this.maxSize) {
oversize = true;
}
return {
file: files[index],
content: contents[index]
};
});
_this.onAfterRead(payload, oversize);
});
} else {
this.readFile(files).then(function (content) {
_this.onAfterRead({
file: files,
content: content
}, files.size > _this.maxSize);
});
}
},
readFile: function readFile(file) {
var _this2 = this;
return new Promise(function (resolve) {
var reader = new FileReader();
reader.onload = function (event) {
resolve(event.target.result);
};
if (_this2.resultType === 'dataUrl') {
reader.readAsDataURL(file);
} else if (_this2.resultType === 'text') {
reader.readAsText(file);
}
});
},
onAfterRead: function onAfterRead(files, oversize) {
if (oversize) {
this.$emit('oversize', files);
} else {
this.afterRead && this.afterRead(files);
this.$refs.input && (this.$refs.input.value = '');
}
}
}
});
exports.default = _default;