上传宫格 
上传宫格布局组件。
提示
此组件只用于布局,不包含上传功能,请自行实现上传功能。
基础使用 
通过 list 属性设置上传文件列表。
vue
<template>
	<pure-upload-grid :list="list"></pure-upload-grid>
</template>
<script setup>
	import { ref } from "vue";
	// 文件列表
	const list = ref([
		{
			status: "waiting",
			path: "/static/images/w_1.jpeg",
			progress: 0
		}
		// ...
	]);
</script>数据格式 
list 是一个数组,每个元素是一个对象,对象属性如下:
status:上传状态waiting:等待上传uploading:上传中success:上传成功error:上传失败
path:预览图路径,或通过coverKey自定义封面图键值。progress:文件上传进度。
完整示例 
vue
<template>
	<pure-upload-grid
		:list="list"
		:cover-key="path"
		@onChoose="handleChoose"
		@onDelete="handleDelete"
	></pure-upload-grid>
	<!-- 上传 -->
	<pure-button
		text="上传文件"
		block
		theme="primary"
		@onClick="handleUpload"
	></pure-button>
</template>
<script setup>
	import { ref } from "vue";
	// 文件列表
	const list = ref([
		{
			status: "waiting",
			path: "/static/images/w_1.jpeg",
			progress: 0
		}
	]);
	// 点击了上传按钮 - 选择文件
	// count: 剩余可选数量
	function handleChoose(count) {
		uni.chooseImage({
			count,
			success: (res) => {
				const files = res.tempFiles;
				// 循环处理文件数据
				files.forEach((item, index) => {
					// 构建列表数据结构
					// 重要提示:不要直接在 item 上操作
					// 因为 item 是个文件对象
					// 在实际测试中发现,如果直接给 item 添加 status、progress 等数据,数据会失去响应性
					// 所以这里要单独构建一个对象,避免直接操作 item
					list.value.push({
						status: "waiting",
						path: item.path,
						file: item
					});
				});
			}
		});
	}
	// 上传文件
	function handleUpload() {
		// 遍历文件列表,模拟上传
		list.value.forEach((item, index) => {
			onUpload(item, index);
		});
	}
	// 模拟上传
	function onUpload(item, index) {
		// 首先将状态更新为上传中
		item.status = "uploading";
		// 模拟上传进度
		let interval = setInterval(() => {
			// 随机 0-1 的数字
			const random = Math.random();
			// 判断是否上传完成
			if (item.progress >= 100) {
				// 上传完成
				// 清除定时器
				clearInterval(interval);
				// 模拟上传成功或失败
				// 更新上传状态
				item.status = index % 2 === 0 ? "success" : "fail";
			} else {
				// 上传中
				// 更新上传进度
				item.progress = item.progress + random;
			}
		}, 50);
	}
	// 删除文件
	// index: 删除的索引
	// item: 删除的项
	function handleDelete(index, item) {
		list.value.splice(index, 1);
	}
</script>属性 
| 名称 | 类型 | 默认值 | 说明 | 
|---|---|---|---|
hoverClass | String | pure-hover | 按下去的样式类 | 
cols | [Number, String] | 3 | 列数 | 
gap | String | 10px | 列表项间隔 | 
list | Array | [] | 文件列表 | 
ratio | String | 1:1 | 列表项的宽高比 | 
coverKey | String | path | 封面图片键名 | 
coverMode | String | aspectFill | 封面图片裁剪模式 | 
maxCount | Number | 9 | 最大上传数量 | 
uploadingIconName | String | 上传中图标名称 | |
uploadingIconMode | String | undefined | 上传中图标裁剪模式 | 
uploadingIconOpts | Object | {} | 上传中图标配置 参考 | 
uploadingText | String | 上传中文字 | |
failIconName | String | __tips | 上传失败图标名称 | 
failIconMode | String | undefined | 上传失败图标裁剪模式 | 
failIconOpts | Object | {} | 上传失败图标配置 参考 | 
failText | String | 上传失败文字 | |
deleteIconName | String | __trash | 删除图标名称 | 
deleteIconMode | String | undefined | 删除图标裁剪模式 | 
deleteIconOpts | Object | {} | 删除图标配置 参考 | 
previewIconName | String | __eye | 预览图标名称 | 
previewIconMode | String | undefined | 预览图标裁剪模式 | 
previewIconOpts | Object | {} | 预览图标配置 参考 | 
btnIconName | String | __upload | 上传按钮图标名称 | 
btnIconMode | String | undefined | 上传按钮图标裁剪模式 | 
btnIconOpts | Object | {} | 上传按钮图标配置 参考 | 
btnText | String | 上传按钮文字 | |
showProgress | Boolean | true | 是否显示上传进度 | 
showProgressText | Boolean | true | 是否显示上传进度文字 | 
progressSize | String | 4px | 进度条高度 | 
progressOpts | Object | {} | 进度条配置 参考 | 
事件 
| 名称 | 参数 | 说明 | 
|---|---|---|
onChoose | count: 剩余可选数量 | 点击上传按钮进行选择文件事件 | 
onDelete | index: 下标, item: 数据项 | 删除事件 | 
插槽 
| 名称 | 参数 | 说明 | 
|---|---|---|
#waiting | 等待上传状态 | |
#uploading | 上传中状态 | |
#fail | 上传失败状态 | |
#success | 上传成功状态 | 
样式变量 
| 名称 | 说明 | 
|---|---|
--pure-upload-grid-columns | 列数 | 
--pure-upload-grid-gap | 间距 | 
--pure-upload-grid-item-background | 项目背景 | 
--pure-upload-grid-item-border-radius | 项目圆角 | 
--pure-upload-grid-item-status-background | 状态背景 | 
--pure-upload-grid-item-status-color | 状态文本颜色 | 
--pure-upload-grid-item-status-gap | 状态内容间距 | 
--pure-upload-grid-item-status-icon-font-size | 状态图标字体大小 | 
--pure-upload-grid-item-status-icon-color | 状态图标颜色 | 
--pure-upload-grid-loading-animation-duration | 加载动画时长 | 
--pure-upload-grid-loading-animation-timing-function | 加载动画时间函数 | 
--pure-upload-grid-item-status-text-font-size | 状态文本字体大小 | 
--pure-upload-grid-item-status-text-font-weight | 状态文本字体粗细 | 
--pure-upload-grid-item-status-progress-direction | 进度条布局方向 | 
--pure-upload-grid-item-status-progress-gap | 进度条内容间距 | 
--pure-upload-grid-item-status-progress-width | 进度条宽度 | 
--pure-upload-grid-item-status-progress-track-color | 进度条轨道颜色 | 
--pure-upload-grid-item-status-progress-margin | 进度条外边距 | 
--pure-upload-grid-item-status-progress-text-font-size | 进度条文本字体大小 | 
--pure-upload-grid-upload-button-color | 上传按钮文本颜色 | 
--pure-upload-grid-upload-button-icon-font-size | 上传按钮图标字体大小 | 
--pure-upload-grid-upload-button-icon-font-weight | 上传按钮图标字体粗细 | 
--pure-upload-grid-upload-button-text-font-size | 上传按钮文本字体大小 | 
--pure-upload-grid-upload-button-text-font-weight | 上传按钮文本字体粗细 |