123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- import { VantComponent } from '../common/component';
- import { isImageFile } from './utils';
- import { addUnit } from '../common/utils';
- VantComponent({
- props: {
- disabled: Boolean,
- multiple: Boolean,
- uploadText: String,
- useSlot: Boolean,
- useBeforeRead: Boolean,
- previewSize: {
- type: null,
- value: 90,
- observer: 'setComputedPreviewSize'
- },
- name: {
- type: [Number, String],
- value: ''
- },
- accept: {
- type: String,
- value: 'image'
- },
- fileList: {
- type: Array,
- value: [],
- observer: 'formatFileList'
- },
- maxSize: {
- type: Number,
- value: Number.MAX_VALUE
- },
- maxCount: {
- type: Number,
- value: 100
- },
- deletable: {
- type: Boolean,
- value: true
- },
- previewImage: {
- type: Boolean,
- value: true
- },
- previewFullImage: {
- type: Boolean,
- value: true
- },
- imageFit: {
- type: String,
- value: 'scaleToFill'
- }
- },
- data: {
- lists: [],
- computedPreviewSize: '',
- isInCount: true
- },
- methods: {
- formatFileList() {
- const { fileList = [], maxCount } = this.data;
- const lists = fileList.map(item => (Object.assign(Object.assign({}, item), { isImage: typeof item.isImage === 'undefined' ? isImageFile(item) : item.isImage })));
- this.setData({ lists, isInCount: lists.length < maxCount });
- },
- setComputedPreviewSize(val) {
- this.setData({
- computedPreviewSize: addUnit(val)
- });
- },
- startUpload() {
- if (this.data.disabled)
- return;
- const { name = '', capture = ['album', 'camera'], maxCount = 100, multiple = false, maxSize, accept, lists, useBeforeRead = false // 是否定义了 beforeRead
- } = this.data;
- let chooseFile = null;
- const newMaxCount = maxCount - lists.length;
- // 设置为只选择图片的时候使用 chooseImage 来实现
- if (accept === 'image') {
- chooseFile = new Promise((resolve, reject) => {
- wx.chooseImage({
- count: multiple ? (newMaxCount > 9 ? 9 : newMaxCount) : 1,
- sourceType: capture,
- success: resolve,
- fail: reject
- });
- });
- }
- else {
- chooseFile = new Promise((resolve, reject) => {
- wx.chooseMessageFile({
- count: multiple ? newMaxCount : 1,
- type: 'file',
- success: resolve,
- fail: reject
- });
- });
- }
- chooseFile.then((res) => {
- const file = multiple ? res.tempFiles : res.tempFiles[0];
- // 检查文件大小
- if (file instanceof Array) {
- const sizeEnable = file.every(item => item.size <= maxSize);
- if (!sizeEnable) {
- this.$emit('oversize', { name });
- return;
- }
- }
- else if (file.size > maxSize) {
- this.$emit('oversize', { name });
- return;
- }
- // 触发上传之前的钩子函数
- if (useBeforeRead) {
- this.$emit('before-read', {
- file,
- name,
- callback: (result) => {
- if (result) {
- // 开始上传
- this.$emit('after-read', { file, name });
- }
- }
- });
- }
- else {
- this.$emit('after-read', { file, name });
- }
- });
- },
- deleteItem(event) {
- const { index } = event.currentTarget.dataset;
- this.$emit('delete', { index, name: this.data.name });
- },
- doPreviewImage(event) {
- if (!this.data.previewFullImage)
- return;
- const curUrl = event.currentTarget.dataset.url;
- const images = this.data.lists
- .filter(item => item.isImage)
- .map(item => item.url || item.path);
- this.$emit('click-preview', { url: curUrl, name: this.data.name });
- wx.previewImage({
- urls: images,
- current: curUrl,
- fail() {
- wx.showToast({ title: '预览图片失败', icon: 'none' });
- }
- });
- }
- }
- });
|