08 多张图片上传+删除

08 多张图片上传+删除

一 多张图片上传

思路:

1 根据uni_app提供的示例copy下来组件

2 在自己的add-input.vue里面注册该组件,并渲染该组件

3 调试copy下来的组件

​ 3-1 删除掉没有用的东西,先删除掉没有用的标签,再commond+F 鉴别出来没有用的方法。

​ 3-2 在选择成功回掉success里面通知父组件(add-input.vue) 发送选择的结果。

4 在自己的add-input.vue里面接受上传图片组件传输过来的参数。

1 根据uni_app提供的示例copy下来组件

copy下来hollo-uniapp/pages/API/image/image.vue

copy到我们项目的/components/common路径下

2 在自己的add-input.vue里面注册该组件,并渲染该组件add-input.vue里面注册该组件

...
<!-- 多图上传 -->
		<upload-image @choose="choose"></upload-image>
...
import uploadImage from '@/components/common/upload-image.vue'
	
	export default {
		components:{
			uploadImage
		},
    
    ...

3 调试copy下来的组件

​ 3-1 删除掉没有用的东西,先删除掉没有用的标签,再commond+F 鉴别出来没有用的方法。

​ 3-2 在选择成功回掉success里面通知父组件(add-input.vue) 发送选择的结果。

<template>
	<view>
		
		<view class="py-2">
			<view class="uni-uploader">
				<view class="uni-uploader-head">
					<view class="uni-uploader-title p-1">点击可预览选好的图片</view>
					<view class="uni-uploader-info">{{imageList.length}}/9</view>
				</view>
				<view class="uni-uploader-body">
					<view class="uni-uploader__files">
						<block v-for="(image,index) in imageList" :key="index">
							<view class="uni-uploader__file">
								<image class="uni-uploader__img rounded " mode="aspectFill" :src="image" :data-src="image" @tap="previewImage"></image>
							</view>
						</block>
						<view class="uni-uploader__input-box rounded">
							<view class="uni-uploader__input" @tap="chooseImage"></view>
						</view>
					</view>
				</view>
			</view>

		</view>
	</view>
</template>
<script>
	import permision from "@/common/permission.js"
	var sourceType = [
		['camera'],
		['album'],
		['camera', 'album']
	]
	var sizeType = [
		['compressed'],
		['original'],
		['compressed', 'original']
	]
	export default {
		data() {
			return {
				title: 'choose/previewImage',
				imageList: [],
				sourceTypeIndex: 2,
				sourceType: ['拍照', '相册', '拍照或相册'],
				sizeTypeIndex: 2,
				sizeType: ['压缩', '原图', '压缩或原图'],
				countIndex: 8,
				count: [1, 2, 3, 4, 5, 6, 7, 8, 9]
			}
		},
		onUnload() {
			this.imageList = [],
				this.sourceTypeIndex = 2,
				this.sourceType = ['拍照', '相册', '拍照或相册'],
				this.sizeTypeIndex = 2,
				this.sizeType = ['压缩', '原图', '压缩或原图'],
				this.countIndex = 8;
		},
		methods: {
			chooseImage: async function() {
				// #ifdef APP-PLUS
				// TODO 选择相机或相册时 需要弹出actionsheet,目前无法获得是相机还是相册,在失败回调中处理
				if (this.sourceTypeIndex !== 2) {
					let status = await this.checkPermission();
					if (status !== 1) {
						return;
					}
				}
				// #endif

				if (this.imageList.length === 9) {
					let isContinue = await this.isFullImg();
					console.log("是否继续?", isContinue);
					if (!isContinue) {
						return;
					}
				}
				uni.chooseImage({
					sourceType: sourceType[this.sourceTypeIndex],
					sizeType: sizeType[this.sizeTypeIndex],
					count: this.imageList.length + this.count[this.countIndex] > 9 ? 9 - this.imageList.length : this.count[this.countIndex],
					success: (res) => {
						this.imageList = this.imageList.concat(res.tempFilePaths);
						// 选择好后通知父组件
						this.$emit('choose',this.imageList)
					},
					fail: (err) => {
						// #ifdef APP-PLUS
						if (err['code'] && err.code !== 0 && this.sourceTypeIndex === 2) {
							this.checkPermission(err.code);
						}
						// #endif
						// #ifdef MP
						uni.getSetting({
							success: (res) => {
								let authStatus = false;
								switch (this.sourceTypeIndex) {
									case 0:
										authStatus = res.authSetting['scope.camera'];
										break;
									case 1:
										authStatus = res.authSetting['scope.album'];
										break;
									case 2:
										authStatus = res.authSetting['scope.album'] && res.authSetting['scope.camera'];
										break;
									default:
										break;
								}
								if (!authStatus) {
									uni.showModal({
										title: '授权失败',
										content: 'Hello uni-app需要从您的相机或相册获取图片,请在设置界面打开相关权限',
										success: (res) => {
											if (res.confirm) {
												uni.openSetting()
											}
										}
									})
								}
							}
						})
						// #endif
					}
				})
			},
			isFullImg: function() {
				return new Promise((res) => {
					uni.showModal({
						content: "已经有9张图片了,是否清空现有图片?",
						success: (e) => {
							if (e.confirm) {
								this.imageList = [];
								res(true);
							} else {
								res(false)
							}
						},
						fail: () => {
							res(false)
						}
					})
				})
			},
			previewImage: function(e) {
				var current = e.target.dataset.src
				uni.previewImage({
					current: current,
					urls: this.imageList
				})
			},
			async checkPermission(code) {
				let type = code ? code - 1 : this.sourceTypeIndex;
				let status = permision.isIOS ? await permision.requestIOS(sourceType[type][0]) :
					await permision.requestAndroid(type === 0 ? 'android.permission.CAMERA' :
						'android.permission.READ_EXTERNAL_STORAGE');

				if (status === null || status === 1) {
					status = 1;
				} else {
					uni.showModal({
						content: "没有开启权限",
						confirmText: "设置",
						success: function(res) {
							if (res.confirm) {
								permision.gotoAppSetting();
							}
						}
					})
				}

				return status;
			}
		}
	}
</script>

<style>
	.cell-pd {
		padding: 22upx 30upx;
	}

	.list-pd {
		margin-top: 50upx;
	}
</style>

4 在自己的add-input.vue里面接受上传图片组件(子组件)传输过来的参数。

methods: {
			...
			
			//选中图片
			choose(e){
				this.imageList = e
				console.log(e)
			}
  	 ...
			
			
		}

二 多张图片删除(注意relative)

思路:

1 定制删除图标

2 编写删除事件

4 通知父组件实时的图片的列表

1 定制删除图标

css思路

利用绝对定位,

父元素position:relative"

子元素posttion: absolute; top:0 ;right: 0 背景颜色浅灰

<view class="uni-uploader__file position-relative">
								<image class="uni-uploader__img rounded " mode="aspectFill" :src="image" :data-src="image" @tap="previewImage"></image>
								<view class="position-absolute top-0 right-0 rounded px-1" style="background-color: rgba(0,0,0,0.5); " 
								@click.stop="deleteImage(index)">
									<text class="iconfont icon-shanchu text-white"></text>
								</view>
							</view>

2 编写删除事件

deleteImage(index){
				uni.showModal({
					title:'提示',// 
					content:'是否删除该图片?', //
					showCancel:true, // 
					cancelText:'不删除',
					confirmText:'删除',
					success:res => {
						if (res.confirm){
							this.imageList.splice(index,1) // 删除列表中的该索引
							this.$emit('change',this.imageList)
						}
					}
				})
			},

4 通知父组件实时的图片的列表

通知的函数在上个标题已经写了。

修改大标题一的父组件接受子组件方法。

<!-- 多图上传 -->
		<upload-image @change="changeImage"></upload-image>
methods: {
			//选中图片
			changeImage(e){
				this.imageList = e
				console.log(e)
			}
			
			
		}
posted @ 2020-04-09 11:20  张明岩  阅读(352)  评论(0编辑  收藏  举报