lulouis-vant
Version:
Lightweight Mobile UI Components built on Vue
122 lines (105 loc) • 2.92 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
exports.__esModule = true;
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _utils = require("../utils");
var _use = (0, _utils.use)('uploader'),
sfc = _use[0],
bem = _use[1];
var _default = sfc({
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 = '');
}
}
},
render: function render(h) {
var accept = this.accept,
disabled = this.disabled;
return h("div", {
"class": bem()
}, [this.$slots.default, h("input", {
"attrs": (0, _extends2.default)({}, this.$attrs, {
"type": "file",
"accept": accept,
"disabled": disabled
}),
"ref": "input",
"class": bem('input'),
"on": {
"change": this.onChange
}
})]);
}
});
exports.default = _default;